diff --git a/.github/agents/community-toolkit-integration-doc-writer.agent.md b/.github/agents/community-toolkit-integration-doc-writer.agent.md
index ab1a52b26..5f9b54f70 100644
--- a/.github/agents/community-toolkit-integration-doc-writer.agent.md
+++ b/.github/agents/community-toolkit-integration-doc-writer.agent.md
@@ -162,7 +162,7 @@ This step ensures that the documentation you've created is properly indexed and
### AppHost language parity
- Follow the `doc-writer` skill's AppHost language parity guidance for all AppHost and hosting-integration examples.
-- Always show both C# AppHost (`AppHost.cs`) and TypeScript AppHost (`apphost.ts`) variants inside synced `Tabs` (with `syncKey='aspire-lang'`) unless the feature is genuinely language-specific or TypeScript AppHost support does not exist yet.
+- Always show both C# AppHost (`AppHost.cs`) and TypeScript AppHost (`apphost.mts`) variants inside synced `Tabs` (with `syncKey='aspire-lang'`) unless the feature is genuinely language-specific or TypeScript AppHost support does not exist yet.
- Before writing a TypeScript AppHost example, verify the API exists in the TypeScript AppHost SDK. Do not invent TypeScript samples.
- If TypeScript AppHost support is not available, show only the C# example without language tabs and add a note that TypeScript AppHost support for the integration is not yet available.
- Use language-neutral prose around AppHost examples, such as "Add a resource to your AppHost" instead of C#-specific method instructions.
diff --git a/.github/skills/aspire/SKILL.md b/.github/skills/aspire/SKILL.md
index bbdc8be52..2efe9d826 100644
--- a/.github/skills/aspire/SKILL.md
+++ b/.github/skills/aspire/SKILL.md
@@ -5,7 +5,7 @@ description: "Orchestrates Aspire distributed applications using the Aspire CLI
# Aspire Skill
-This repository uses Aspire to orchestrate its distributed application. Resources are defined in the AppHost project (`apphost.cs` or `apphost.ts`).
+This repository uses Aspire to orchestrate its distributed application. Resources are defined in the AppHost project (`apphost.cs` or `apphost.mts`).
## CLI command reference
diff --git a/.github/skills/doc-writer/SKILL.md b/.github/skills/doc-writer/SKILL.md
index 0b782d768..3e3719734 100644
--- a/.github/skills/doc-writer/SKILL.md
+++ b/.github/skills/doc-writer/SKILL.md
@@ -73,8 +73,36 @@ description: A brief summary of the page content (required for SEO)
Optional frontmatter fields:
- `next: false` - Disable "Next page" link for terminal pages
+- `seoTitle` - Override the page's `og:title` / `twitter:title` only,
+ without touching the visible H1 or sidebar label. Use this **only**
+ when the natural H1 must stay short (commands, terse labels). When
+ set, the value is emitted verbatim — no `· Aspire` suffix is appended.
- Custom metadata as needed by Starlight theme
+#### SEO length targets
+
+The site uses Open Graph metadata to render social cards and feed SEO
+tooling. To keep previews scannable on every social network and to
+avoid the "title too short / description too long" lints that surface
+on Yoast, LinkedIn, and the search-console reports, follow these
+length targets when authoring frontmatter:
+
+| Field | Composed length target | Hard limit |
+| ------------- | ---------------------: | ---------: |
+| `title` | 41-51 characters | 70 characters |
+| `seoTitle` | 50-60 characters | 70 characters |
+| `description` | 110-160 characters | 200 characters (auto-truncated) |
+
+`title` becomes `og:title` composed as `${title} · Aspire`, so the
+target window leaves room for the 9-character suffix. `seoTitle`
+overrides the composition outright — write the full string yourself.
+
+Surface keywords from the article body itself in the description
+(verbs, integration names, API surfaces). The CI guard at
+`tests/unit/seo-lengths.vitest.test.ts` fails when any English page
+strays outside the wider 30-65 / 80-200 character guard ranges, so a
+draft can land slightly off-target and tighten in follow-ups.
+
### Required Imports
Import Starlight components at the top of your MDX file:
@@ -368,8 +396,8 @@ builder.Build().Run();
````
````mdx
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -407,7 +435,7 @@ For client/library packages:
## AppHost Language Parity (C# and TypeScript)
-Aspire supports both **C# AppHosts** (`AppHost.cs`) and **TypeScript AppHosts** (`apphost.ts`). Documentation must treat both languages as first-class citizens. **Always show both C# and TypeScript code samples for AppHost code unless the feature is genuinely language-specific or TypeScript support does not exist yet.** Never write AppHost or hosting-integration documentation with a C#-only bias.
+Aspire supports both **C# AppHosts** (`AppHost.cs`) and **TypeScript AppHosts** (`apphost.mts`). Documentation must treat both languages as first-class citizens. **Always show both C# and TypeScript code samples for AppHost code unless the feature is genuinely language-specific or TypeScript support does not exist yet.** Never write AppHost or hosting-integration documentation with a C#-only bias.
### Core Principles
@@ -440,8 +468,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -467,10 +495,10 @@ If a section heading should appear in the **On this page** table of contents, ke
| Aspect | C# | TypeScript |
| ---------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
-| File title | `title="AppHost.cs"` | `title="apphost.ts"` |
+| File title | `title="AppHost.cs"` | `title="apphost.mts"` |
| Tab wrapper | Shared `` container | Shared `` container |
| Tab item | `` | `` |
-| Builder creation | `DistributedApplication.CreateBuilder(args)` | `import { createBuilder } from './.modules/aspire.js';` then newline for space followed by `await createBuilder();` |
+| Builder creation | `DistributedApplication.CreateBuilder(args)` | `import { createBuilder } from './.aspire/modules/aspire.mjs';` then newline for space followed by `await createBuilder();` |
| Method casing | PascalCase (`AddRedis`) | camelCase (`addRedis`) |
| Async pattern | Synchronous fluent calls | `await` each builder call |
| Build & run | `builder.Build().Run()` | `await builder.build().run()` |
@@ -565,8 +593,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -616,8 +644,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
diff --git a/src/frontend/astro.config.mjs b/src/frontend/astro.config.mjs
index cccd546a6..8e2867f77 100644
--- a/src/frontend/astro.config.mjs
+++ b/src/frontend/astro.config.mjs
@@ -125,7 +125,7 @@ export default defineConfig({
starlightLinksValidator({
errorOnRelativeLinks: false,
errorOnFallbackPages: false,
- exclude: ['/i18n/'],
+ exclude: ['/i18n/', '/reference/api', '/reference/api/**'],
}),
starlightScrollToTop({
// https://frostybee.github.io/starlight-scroll-to-top/svg-paths/
diff --git a/src/frontend/config/redirects.mjs b/src/frontend/config/redirects.mjs
index 43726d99c..2424fd380 100644
--- a/src/frontend/config/redirects.mjs
+++ b/src/frontend/config/redirects.mjs
@@ -175,6 +175,9 @@ export const redirects = {
'/integrations/devtools/flagd/': '/integrations/devtools/flagd/flagd-get-started/',
'/integrations/devtools/goff/': '/integrations/devtools/goff/goff-get-started/',
'/integrations/devtools/mailpit/': '/integrations/devtools/mailpit/mailpit-get-started/',
+ '/integrations/frameworks/go/': '/integrations/frameworks/go/go-get-started/',
+ '/integrations/frameworks/go-apps/': '/integrations/frameworks/go/go-get-started/',
+ '/ja/integrations/frameworks/go-apps/': '/integrations/frameworks/go/go-get-started/',
'/integrations/frameworks/csharp-file-based-apps/': '/integrations/dotnet/csharp-file-based-apps/',
'/integrations/frameworks/maui/': '/integrations/dotnet/maui/',
'/fundamentals/service-defaults/': '/get-started/csharp-service-defaults/',
diff --git a/src/frontend/config/sidebar/docs.topics.ts b/src/frontend/config/sidebar/docs.topics.ts
index 419aa2e62..02565d14d 100644
--- a/src/frontend/config/sidebar/docs.topics.ts
+++ b/src/frontend/config/sidebar/docs.topics.ts
@@ -90,6 +90,10 @@ export const docsTopics: StarlightSidebarTopicsUserConfig = {
label: "What's new",
collapsed: true,
items: [
+ {
+ label: 'Aspire 13.4',
+ slug: 'whats-new/aspire-13-4',
+ },
{
label: 'Aspire 13.3',
slug: 'whats-new/aspire-13-3',
diff --git a/src/frontend/config/sidebar/integrations.topics.ts b/src/frontend/config/sidebar/integrations.topics.ts
index 6a845b82b..9dc395801 100644
--- a/src/frontend/config/sidebar/integrations.topics.ts
+++ b/src/frontend/config/sidebar/integrations.topics.ts
@@ -1248,7 +1248,7 @@ export const integrationTopics: StarlightSidebarTopicsUserConfig = {
},
],
},
- {
+ {
label: 'SQLite',
collapsed: true,
items: [
@@ -1332,13 +1332,35 @@ export const integrationTopics: StarlightSidebarTopicsUserConfig = {
{ label: 'C# file-based apps', slug: 'integrations/dotnet/csharp-file-based-apps' },
{ label: 'Launch profiles', slug: 'integrations/dotnet/launch-profiles' },
{ label: '.NET tool resources', slug: 'integrations/dotnet/dotnet-tool-resources' },
+ {
+ label: 'Blazor',
+ collapsed: true,
+ items: [
+ { label: 'Get started', slug: 'integrations/dotnet/blazor-get-started' },
+ { label: 'Set up Blazor hosting in the AppHost', slug: 'integrations/dotnet/blazor-hosting' },
+ { label: 'Connect Blazor apps and APIs', slug: 'integrations/dotnet/blazor-connect' },
+ ],
+ },
{ label: '.NET MAUI', slug: 'integrations/dotnet/maui' },
{ label: 'WPF and Windows Forms', slug: 'integrations/frameworks/wpf-winforms' },
{ label: 'Orleans', slug: 'integrations/frameworks/orleans' },
],
},
{ label: 'Dapr', slug: 'integrations/frameworks/dapr' },
- { label: 'Go', slug: 'integrations/frameworks/go-apps' },
+ {
+ label: 'Go',
+ collapsed: true,
+ items: [
+ {
+ label: 'Get started',
+ slug: 'integrations/frameworks/go/go-get-started',
+ },
+ {
+ label: 'Set up Go apps in the AppHost',
+ slug: 'integrations/frameworks/go/go-host',
+ },
+ ],
+ },
{ label: 'Java', slug: 'integrations/frameworks/java' },
{
label: 'JavaScript and Node.js',
diff --git a/src/frontend/config/sidebar/reference.topics.ts b/src/frontend/config/sidebar/reference.topics.ts
index 91ec7435f..bfd5985cd 100644
--- a/src/frontend/config/sidebar/reference.topics.ts
+++ b/src/frontend/config/sidebar/reference.topics.ts
@@ -602,6 +602,10 @@ export const referenceTopics: StarlightSidebarTopicsUserConfig[number] = {
label: 'ASPIREEXPORT013',
link: '/diagnostics/aspireexport013',
},
+ {
+ label: 'ASPIREEXPORT016',
+ link: '/diagnostics/aspireexport016',
+ },
{
label: 'ASPIRECERTIFICATES001',
link: '/diagnostics/aspirecertificates001',
@@ -666,6 +670,10 @@ export const referenceTopics: StarlightSidebarTopicsUserConfig[number] = {
label: 'ASPIREPOSTGRES001',
link: '/diagnostics/aspirepostgres001',
},
+ {
+ label: 'ASPIREPROCESSCOMMAND001',
+ link: '/diagnostics/aspireprocesscommand001',
+ },
{
label: 'ASPIREUSERSECRETS001',
link: '/diagnostics/aspireusersecrets001',
@@ -708,6 +716,10 @@ export const referenceTopics: StarlightSidebarTopicsUserConfig[number] = {
label: 'ASPIREEXPORT004',
link: '/diagnostics/aspireexport004',
},
+ {
+ label: 'ASPIREEXPORT015',
+ link: '/diagnostics/aspireexport015',
+ },
{
label: 'ASPIREHOSTINGPYTHON001',
link: '/diagnostics/aspirehostingpython001',
diff --git a/src/frontend/config/twoslash.config.mjs b/src/frontend/config/twoslash.config.mjs
index 0d1f09879..0ab1c1ac5 100644
--- a/src/frontend/config/twoslash.config.mjs
+++ b/src/frontend/config/twoslash.config.mjs
@@ -41,7 +41,8 @@ export const TWOSLASH_ENABLED = true;
* `typescript` package from `ec.config.mjs`).
*
* - `moduleResolution: 100` → `ts.ModuleResolutionKind.Bundler` so
- * `./.modules/aspire.js` falls through to the virtual `.modules/aspire.ts`.
+ * `./.aspire/modules/aspire.mjs` falls through to the virtual
+ * `.aspire/modules/aspire.mts`.
* - `module: 99` → `ts.ModuleKind.ESNext` (paired with bundler resolution).
* - `target: 99` → `ts.ScriptTarget.ESNext` so `lib.esnext.full.d.ts` is the
* default `lib`, pulling in `Date`, `URL`, DOM, and friends via TS's
@@ -79,12 +80,12 @@ export function readAspireTypes() {
/**
* Returns the `extraFiles` map twoslash should mount in its VFS. Returns an
* empty object when the SDK bundle is missing so twoslash can still compile
- * blocks that don't import from `./.modules/aspire.js` (they'll just see
+ * blocks that don't import from `./.aspire/modules/aspire.mjs` (they'll just see
* `any` for the missing module — same fallback `ec.config.mjs` had inline).
*/
export function getTwoslashExtraFiles() {
const { source } = readAspireTypes();
- return source ? { '.modules/aspire.ts': source } : {};
+ return source ? { '.aspire/modules/aspire.mts': source } : {};
}
/**
diff --git a/src/frontend/scripts/generate-twoslash-types.ts b/src/frontend/scripts/generate-twoslash-types.ts
index d5575b795..3474e7e51 100644
--- a/src/frontend/scripts/generate-twoslash-types.ts
+++ b/src/frontend/scripts/generate-twoslash-types.ts
@@ -105,13 +105,10 @@ function cleanType(raw: string | undefined): string {
// Collapse fully-qualified namespaced identifiers (with '.' and/or '/' separators)
// to their trailing simple-name segment, in-place — so occurrences inside generic
// args are handled without swallowing surrounding brackets.
- s = s.replace(
- /[A-Za-z_][A-Za-z0-9_]*(?:[./][A-Za-z_][A-Za-z0-9_]*)+/g,
- (m) => {
- const afterSlash = m.includes('/') ? m.slice(m.lastIndexOf('/') + 1) : m;
- return lastDotted(afterSlash);
- }
- );
+ s = s.replace(/[A-Za-z_][A-Za-z0-9_]*(?:[./][A-Za-z_][A-Za-z0-9_]*)+/g, (m) => {
+ const afterSlash = m.includes('/') ? m.slice(m.lastIndexOf('/') + 1) : m;
+ return lastDotted(afterSlash);
+ });
// recover from known junk produced by the upstream generator (stray `]]`)
s = s.replace(/\]\]+/g, '');
return s || 'unknown';
@@ -130,8 +127,22 @@ function camelCase(name: string): string {
function sanitizeIdentifier(name: string): string {
// JS reserved words we might collide with when a param is named e.g. 'default'
const reserved = new Set([
- 'default', 'function', 'class', 'new', 'return', 'delete', 'enum', 'package',
- 'private', 'protected', 'public', 'static', 'interface', 'in', 'of', 'as'
+ 'default',
+ 'function',
+ 'class',
+ 'new',
+ 'return',
+ 'delete',
+ 'enum',
+ 'package',
+ 'private',
+ 'protected',
+ 'public',
+ 'static',
+ 'interface',
+ 'in',
+ 'of',
+ 'as',
]);
return reserved.has(name) ? `_${name}` : name;
}
@@ -156,9 +167,19 @@ function formatParams(params: Parameter[]): string {
// Primitive types we're safe to collapse into an options-object overload. If any
// param uses a richer type (resource/handle/enum) we keep the positional form.
const PRIMITIVE_TYPES = new Set([
- 'string', 'number', 'boolean', 'bigint', 'symbol', 'unknown', 'any',
- 'string[]', 'number[]', 'boolean[]',
- 'Array', 'Array', 'Array',
+ 'string',
+ 'number',
+ 'boolean',
+ 'bigint',
+ 'symbol',
+ 'unknown',
+ 'any',
+ 'string[]',
+ 'number[]',
+ 'boolean[]',
+ 'Array',
+ 'Array',
+ 'Array',
]);
function isPrimitiveParamType(t: string): boolean {
@@ -193,6 +214,14 @@ const PARAM_TYPE_OVERRIDES: Record> = {
name: 'string | ParameterResource',
resourceGroup: 'string | ParameterResource',
},
+ // Current Aspire TS SDKs accept connection-string resources as wait
+ // dependencies; the 13.3 ts-modules snapshot still reports IResource only.
+ waitFor: {
+ dependency: 'IResource | IResourceWithConnectionString',
+ },
+ waitForStart: {
+ dependency: 'IResource | IResourceWithConnectionString',
+ },
};
// Global "broaden this type wherever it appears as a parameter" rules. The
@@ -330,6 +359,91 @@ const genericArity = new Map();
const FREE_FUNCTION_NAMES = new Set(['createBuilder', 'createBuilderWithOptions']);
+// Confirmed Aspire 13.4 API surface that may be absent from the checked-in
+// 13.3 ts-modules snapshot until package data is refreshed. Keep these shims
+// narrow and remove them when update-ts-api brings the APIs into
+// src/data/ts-modules.
+const POST_SNAPSHOT_FREE_FUNCTIONS = [
+ `/**
+ * Creates a reference expression from a tagged template literal
+ */
+export declare function refExpr(strings: TemplateStringsArray, ...values: unknown[]): ReferenceExpression;`,
+];
+
+const POST_SNAPSHOT_DECLARATIONS = [
+ `/**
+ * Enum Aspire.Hosting.ApplicationModel.InputType
+ */
+export type InputType = "Text" | "Number" | "Choice" | "SecretText";
+export declare const InputType: {
+ readonly Text: "Text";
+ readonly Number: "Number";
+ readonly Choice: "Choice";
+ readonly SecretText: "SecretText";
+};`,
+ `export interface ParameterCustomInputOptions {
+ inputType?: InputType;
+ label?: string;
+ placeholder?: string;
+ options?: Record;
+}`,
+ `export interface BeforePublishEvent extends IDistributedApplicationEvent {
+ model: PropertyAccessor;
+ services: PropertyAccessor;
+}`,
+ `export interface AfterPublishEvent extends IDistributedApplicationEvent {
+ model: PropertyAccessor;
+ services: PropertyAccessor;
+}`,
+];
+
+const POST_SNAPSHOT_AUGMENTATIONS = [
+ `export interface IDistributedApplicationBuilder {
+ /**
+ * Subscribes to the BeforePublish event
+ */
+ subscribeBeforePublish(callback: (arg: BeforePublishEvent) => Promise): DistributedApplicationEventSubscription;
+ /**
+ * Subscribes to the AfterPublish event
+ */
+ subscribeAfterPublish(callback: (arg: AfterPublishEvent) => Promise): DistributedApplicationEventSubscription;
+}`,
+ `export interface EventingSubscriberRegistrationContext {
+ /**
+ * Subscribes an eventing subscriber to the BeforePublish event
+ */
+ onBeforePublish(callback: (arg: BeforePublishEvent) => Promise): DistributedApplicationEventSubscription;
+ /**
+ * Subscribes an eventing subscriber to the AfterPublish event
+ */
+ onAfterPublish(callback: (arg: AfterPublishEvent) => Promise): DistributedApplicationEventSubscription;
+}`,
+ `export interface IResource {
+ /**
+ * Assigns Microsoft Foundry roles for this resource
+ */
+ withFoundryRoleAssignments(target: FoundryResource, roles: FoundryRole[]): this;
+}`,
+ `export interface ParameterResource {
+ /**
+ * Customizes the parameter input shown by the dashboard
+ */
+ withCustomInput(options: ParameterCustomInputOptions): this;
+}`,
+ `export interface ComposeFile {
+ /**
+ * Adds a top-level Docker Compose volume
+ */
+ addVolume(name: string, options?: { driver?: string; configure?: (volume: Volume) => Promise }): Promise;
+}`,
+ `export interface Service {
+ /**
+ * Adds a Docker Compose volume mount to a service
+ */
+ addVolume(source: string, target: string, options?: { isReadOnly?: boolean }): Promise;
+}`,
+];
+
// Built-in generic container types the ATS tool emits as pseudo-targets — these
// aren't useful in user-facing docs samples (Dict is already modeled as Record,
// List as Array), so we skip them when assigning methods to target interfaces.
@@ -388,9 +502,8 @@ for (const mod of modules) {
function visitFn(fn: FunctionEntry): void {
extractTypeIdentifiers(cleanType(fn.returnType), referencedTypes);
for (const p of fn.parameters) {
- const t = p.isCallback && p.callbackSignature
- ? cleanType(p.callbackSignature)
- : cleanType(p.type);
+ const t =
+ p.isCallback && p.callbackSignature ? cleanType(p.callbackSignature) : cleanType(p.type);
extractTypeIdentifiers(t, referencedTypes);
// track generic arity: look for Name<...> and count top-level commas
const match = t.match(/([A-Za-z_][A-Za-z0-9_]*)<([^<>]*(?:<[^<>]*>[^<>]*)*)>/g);
@@ -448,13 +561,40 @@ for (const fn of freeFunctions) scanExprForGenerics(cleanType(fn.returnType));
// ---------- emit ----------
const BUILT_IN = new Set([
- 'string', 'number', 'boolean', 'any', 'unknown', 'void', 'never', 'null', 'undefined',
- 'object', 'true', 'false', 'this', 'symbol', 'bigint',
+ 'string',
+ 'number',
+ 'boolean',
+ 'any',
+ 'unknown',
+ 'void',
+ 'never',
+ 'null',
+ 'undefined',
+ 'object',
+ 'true',
+ 'false',
+ 'this',
+ 'symbol',
+ 'bigint',
// JS globals we pass through
- 'Promise', 'Array', 'Map', 'Set', 'Date', 'Error', 'RegExp', 'Record', 'Partial',
- 'Readonly', 'Required', 'Pick', 'Omit', 'Exclude', 'Extract',
+ 'Promise',
+ 'Array',
+ 'Map',
+ 'Set',
+ 'Date',
+ 'Error',
+ 'RegExp',
+ 'Record',
+ 'Partial',
+ 'Readonly',
+ 'Required',
+ 'Pick',
+ 'Omit',
+ 'Exclude',
+ 'Extract',
// Our utility aliases / internal helpers declared at the top of the file
- 'Dict', 'PropertyAccessor',
+ 'Dict',
+ 'PropertyAccessor',
]);
const declaredTypes = new Set([
@@ -467,7 +607,7 @@ const declaredTypes = new Set([
const parts: string[] = [];
parts.push(`// Auto-generated by scripts/generate-twoslash-types.ts — do not edit.`);
parts.push(`// This file is consumed by expressive-code-twoslash to provide hover tooltips`);
-parts.push(`// for TypeScript code samples in the docs that import './.modules/aspire.js'.`);
+parts.push(`// for TypeScript code samples in the docs that import './.aspire/modules/aspire.mjs'.`);
parts.push(``);
parts.push(`declare global {`);
parts.push(` type Dict = Record;`);
@@ -481,7 +621,9 @@ parts.push(`// \`builder.executionContext.isRunMode\` — nested direct
parts.push(`// Model as an intersection covering all three. For object T we include`);
parts.push(`// T directly so nested-property access resolves; for primitives we only`);
parts.push(`// need the callable + accessor surface (primitive intersections collapse).`);
-parts.push(`export type PropertyAccessor = (T extends object ? T : unknown) & (() => Promise) & {`);
+parts.push(
+ `export type PropertyAccessor = (T extends object ? T : unknown) & (() => Promise) & {`
+);
parts.push(` get(): Promise;`);
parts.push(` set(value: T): Promise;`);
parts.push(` // Dict-valued accessors are sometimes set entry-wise in docs`);
@@ -490,6 +632,10 @@ parts.push(` set(key: string, value: unknown): Promise;`);
parts.push(`};`);
parts.push(``);
parts.push(`// ---- enums ----`);
+for (const declaration of POST_SNAPSHOT_DECLARATIONS) {
+ parts.push(declaration);
+ parts.push('');
+}
for (const en of enumTypes) {
parts.push(jsdoc([`Enum ${en.fullName}`]));
const members = en.members.map((m) => JSON.stringify(m)).join(' | ') || 'string';
@@ -499,9 +645,7 @@ for (const en of enumTypes) {
// upstream dump only gives us string-valued members, which matches how the
// generated SDK surfaces .NET enums to TS.
if (en.members.length > 0) {
- const fields = en.members
- .map((m) => ` readonly ${m}: ${JSON.stringify(m)};`)
- .join('\n');
+ const fields = en.members.map((m) => ` readonly ${m}: ${JSON.stringify(m)};`).join('\n');
parts.push(`export declare const ${en.name}: {\n${fields}\n};`);
}
parts.push('');
@@ -547,9 +691,7 @@ function isContainerBacked(h: HandleType): boolean {
if (NON_CONTAINER_HANDLES.has(h.name)) return false;
const pkg = handlePackage.get(h.name);
if (pkg && NON_CONTAINER_PACKAGES.has(pkg)) return false;
- const ifaces = new Set(
- (h.implementedInterfaces ?? []).map((i) => lastDotted(i).split('<')[0])
- );
+ const ifaces = new Set((h.implementedInterfaces ?? []).map((i) => lastDotted(i).split('<')[0]));
return (
ifaces.has('IComputeResource') &&
ifaces.has('IResourceWithArgs') &&
@@ -581,8 +723,7 @@ for (const h of handleTypes) {
}
ancestor = classBaseByName.get(ancestor);
}
- const implementsClause =
- uniqueParents.length > 0 ? ` extends ${uniqueParents.join(', ')}` : '';
+ const implementsClause = uniqueParents.length > 0 ? ` extends ${uniqueParents.join(', ')}` : '';
for (const i of uniqueParents) referencedTypes.add(i);
parts.push(jsdoc([`Handle ${h.fullName}`]));
parts.push(`export interface ${h.name}${implementsClause} {`);
@@ -658,8 +799,7 @@ function emitMember(fn: FunctionEntry, indent: string, out: string[]): void {
// polymorphic `this` so the type flows through. Applies to any method
// flagged `returnsBuilder` that isn't actually creating a new resource.
const isFluentPrefix = /^(with|wait|on|publish)[A-Z0-9]/.test(memberName);
- const ret =
- fn.returnsBuilder && isFluentPrefix ? 'this' : declaredRet;
+ const ret = fn.returnsBuilder && isFluentPrefix ? 'this' : declaredRet;
const effectiveParams = applyParamOverrides(memberName, fn.parameters);
// Record referenced types from overridden param types too, so the stubber sees them.
for (const p of effectiveParams) extractTypeIdentifiers(paramType(p), referencedTypes);
@@ -704,6 +844,16 @@ for (const fn of freeFunctions) {
parts.push(`export declare function ${fn.name}(${formatParams(effectiveParams)}): ${ret};`);
parts.push('');
}
+for (const declaration of POST_SNAPSHOT_FREE_FUNCTIONS) {
+ parts.push(declaration);
+ parts.push('');
+}
+
+parts.push(`// ---- confirmed post-snapshot API augmentations ----`);
+for (const declaration of POST_SNAPSHOT_AUGMENTATIONS) {
+ parts.push(declaration);
+ parts.push('');
+}
// ---- stubs for referenced-but-undeclared types ----
const missing: string[] = [];
@@ -727,7 +877,9 @@ for (const name of missing) {
const extendsClause =
/^IResourceWith/.test(name) && name !== 'IResource' ? ' extends IResource' : '';
if (arity > 0) {
- const generics = Array.from({ length: arity }, (_, i) => `T${i === 0 ? '' : i} = unknown`).join(', ');
+ const generics = Array.from({ length: arity }, (_, i) => `T${i === 0 ? '' : i} = unknown`).join(
+ ', '
+ );
parts.push(`export interface ${name}<${generics}>${extendsClause} {}`);
} else {
parts.push(`export interface ${name}${extendsClause} {}`);
@@ -740,6 +892,10 @@ parts.push(`export {};`);
mkdirSync(OUTPUT_DIR, { recursive: true });
writeFileSync(OUTPUT_FILE, parts.join('\n'), 'utf8');
console.log(`✅ Wrote ${OUTPUT_FILE}`);
-console.log(` - ${dtoTypes.length} DTOs, ${enumTypes.length} enums, ${handleTypes.length} handle types`);
-console.log(` - ${methodsByTarget.size} target interfaces, ${freeFunctions.length} free functions`);
+console.log(
+ ` - ${dtoTypes.length} DTOs, ${enumTypes.length} enums, ${handleTypes.length} handle types`
+);
+console.log(
+ ` - ${methodsByTarget.size} target interfaces, ${freeFunctions.length} free functions`
+);
console.log(` - ${missing.length} stub interfaces for referenced SDK types`);
diff --git a/src/frontend/scripts/update-integrations.ts b/src/frontend/scripts/update-integrations.ts
index 193046c8a..14963e432 100644
--- a/src/frontend/scripts/update-integrations.ts
+++ b/src/frontend/scripts/update-integrations.ts
@@ -22,6 +22,7 @@ const EXCLUDED_PACKAGES = [
'Aspire.RabbitMQ.Client.v7',
'CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps',
'CommunityToolkit.Aspire.Hosting.EventStore',
+ 'CommunityToolkit.Aspire.Hosting.Golang',
'CommunityToolkit.Aspire.EventStore',
];
const OUTPUT_PATH = './src/data/aspire-integrations.json';
diff --git a/src/frontend/src/components/AppHostBuilder.astro b/src/frontend/src/components/AppHostBuilder.astro
index 1f5a00098..404a17370 100644
--- a/src/frontend/src/components/AppHostBuilder.astro
+++ b/src/frontend/src/components/AppHostBuilder.astro
@@ -445,7 +445,7 @@ builder.Build().Run();`,
// Define all possible code combinations — TypeScript
const tsCodes: Record = {
- empty: `import { createBuilder } from './.modules/aspire.js';
+ empty: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -455,7 +455,7 @@ const builder = await createBuilder();
await builder.build().run();`,
- frontend: `import { createBuilder } from './.modules/aspire.js';
+ frontend: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -466,7 +466,7 @@ const frontend = await builder
await builder.build().run();`,
- frontendContainer: `import { createBuilder } from './.modules/aspire.js';
+ frontendContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -482,7 +482,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseFrontend: `import { createBuilder } from './.modules/aspire.js';
+ databaseFrontend: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -498,7 +498,7 @@ const frontend = await builder
await builder.build().run();`,
- databaseFrontendContainer: `import { createBuilder } from './.modules/aspire.js';
+ databaseFrontendContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -519,7 +519,7 @@ const customContainer = await builder
await builder.build().run();`,
- apiFrontend: `import { createBuilder } from './.modules/aspire.js';
+ apiFrontend: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -536,7 +536,7 @@ const frontend = await builder
await builder.build().run();`,
- apiFrontendContainer: `import { createBuilder } from './.modules/aspire.js';
+ apiFrontendContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -558,7 +558,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseApiFrontend: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiFrontend: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -581,7 +581,7 @@ const frontend = await builder
await builder.build().run();`,
- databaseApiFrontendContainer: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiFrontendContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -609,7 +609,7 @@ const customContainer = await builder
await builder.build().run();`,
- database: `import { createBuilder } from './.modules/aspire.js';
+ database: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -620,7 +620,7 @@ const postgres = await builder
await builder.build().run();`,
- databaseContainer: `import { createBuilder } from './.modules/aspire.js';
+ databaseContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -636,7 +636,7 @@ const customContainer = await builder
await builder.build().run();`,
- api: `import { createBuilder } from './.modules/aspire.js';
+ api: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -647,7 +647,7 @@ const api = await builder
await builder.build().run();`,
- apiContainer: `import { createBuilder } from './.modules/aspire.js';
+ apiContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -663,7 +663,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseApi: `import { createBuilder } from './.modules/aspire.js';
+ databaseApi: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -680,7 +680,7 @@ const api = await builder
await builder.build().run();`,
- databaseApiContainer: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiContainer: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -702,7 +702,7 @@ const customContainer = await builder
await builder.build().run();`,
- container: `import { createBuilder } from './.modules/aspire.js';
+ container: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -713,7 +713,7 @@ const customContainer = await builder
await builder.build().run();`,
- frontendDeployment: `import { createBuilder } from './.modules/aspire.js';
+ frontendDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -726,7 +726,7 @@ const frontend = await builder
await builder.build().run();`,
- frontendContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ frontendContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -745,7 +745,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseFrontendDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseFrontendDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -765,7 +765,7 @@ const frontend = await builder
await builder.build().run();`,
- databaseFrontendContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseFrontendContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -791,7 +791,7 @@ const customContainer = await builder
await builder.build().run();`,
- apiFrontendDeployment: `import { createBuilder } from './.modules/aspire.js';
+ apiFrontendDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -811,7 +811,7 @@ const frontend = await builder
await builder.build().run();`,
- apiFrontendContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ apiFrontendContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -837,7 +837,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseApiFrontendDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiFrontendDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -866,7 +866,7 @@ const frontend = await builder
await builder.build().run();`,
- databaseApiFrontendContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiFrontendContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -901,7 +901,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -914,7 +914,7 @@ const postgres = await builder
await builder.build().run();`,
- databaseContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -933,7 +933,7 @@ const customContainer = await builder
await builder.build().run();`,
- apiDeployment: `import { createBuilder } from './.modules/aspire.js';
+ apiDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -945,7 +945,7 @@ const api = await builder
await builder.build().run();`,
- apiContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ apiContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -963,7 +963,7 @@ const customContainer = await builder
await builder.build().run();`,
- databaseApiDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -984,7 +984,7 @@ const api = await builder
await builder.build().run();`,
- databaseApiContainerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ databaseApiContainerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1011,7 +1011,7 @@ const customContainer = await builder
await builder.build().run();`,
- containerDeployment: `import { createBuilder } from './.modules/aspire.js';
+ containerDeployment: `import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1215,7 +1215,7 @@ await builder.build().run();`,
data-variant={key}
style={key === 'frontend' ? '' : 'display: none;'}
>
-
+
))
}
diff --git a/src/frontend/src/components/SimpleAppHostCode.shared.ts b/src/frontend/src/components/SimpleAppHostCode.shared.ts
index fac55e695..e50a97b20 100644
--- a/src/frontend/src/components/SimpleAppHostCode.shared.ts
+++ b/src/frontend/src/components/SimpleAppHostCode.shared.ts
@@ -184,7 +184,7 @@ builder.Build().Run();
`;
const csharpTypeScript = `
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -207,7 +207,7 @@ await builder.build().run();
`;
const pythonTypeScript = `
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -231,7 +231,7 @@ await builder.build().run();
`;
const nodejsTypeScript = `
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content.config.ts b/src/frontend/src/content.config.ts
index 9bd2819f9..34c8b58bb 100644
--- a/src/frontend/src/content.config.ts
+++ b/src/frontend/src/content.config.ts
@@ -31,6 +31,18 @@ export const collections = {
* site-wide `og-image.png` is used in social cards instead.
*/
og: z.boolean().optional(),
+ /**
+ * SEO-only title override. Used **verbatim** as the page's
+ * `og:title` and `twitter:title` (no `· Aspire` suffix is
+ * appended) so authors can tune the social-card title to the
+ * 50–60 character optimal range without bloating the visible
+ * `
` or sidebar label. Falls back to `title` when unset.
+ *
+ * Prefer rewriting the visible `title` when the natural H1 can
+ * accommodate the longer string. Use `seoTitle` only when the
+ * sidebar/H1 must stay short (commands, terse labels, etc.).
+ */
+ seoTitle: z.string().optional(),
/**
* The date the release was published to NuGet. Used on What's New
* pages to display the release date near the top of the page.
diff --git a/src/frontend/src/content/docs/app-host/certificate-configuration.mdx b/src/frontend/src/content/docs/app-host/certificate-configuration.mdx
index 57385d665..85ecdd4ec 100644
--- a/src/frontend/src/content/docs/app-host/certificate-configuration.mdx
+++ b/src/frontend/src/content/docs/app-host/certificate-configuration.mdx
@@ -1,6 +1,7 @@
---
title: Certificate configuration
-description: Learn how to configure HTTPS endpoints and certificate trust for resources in Aspire to enable secure communication.
+seoTitle: Aspire HTTPS certificate configuration for AppHost
+description: Configure HTTPS endpoints and certificate trust for Aspire resources to enable secure local development, container-to-container TLS, and trusted browser connections.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -72,11 +73,13 @@ aspire certs trust
You may need to reload your profile or start a new terminal session for the change to take effect.
-### Developer certificate for DCP communication (Windows)
+### Developer certificate for DCP communication
-By default, Aspire's internal Developer Control Plane (DCP) server uses an ephemeral localhost certificate it generates itself for TLS. On Windows, you can opt in to using your trusted Aspire developer certificate for DCP communication instead, which avoids trust issues caused by the ephemeral certificate not being in the system trust store.
+By default, Aspire uses the ASP.NET Core developer certificate to secure communication with its internal Developer Control Plane (DCP) server. This replaces the ephemeral localhost certificate that DCP would otherwise generate itself, and avoids certificate trust errors caused by that certificate not being in the system trust store.
-Set the `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` environment variable to `true` in your AppHost's `launchSettings.json` or as a system/user environment variable:
+If no trusted developer certificate is found, Aspire automatically falls back to DCP's ephemeral certificate.
+
+To opt out and use DCP's default ephemeral certificate instead, set `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` to `false` in your AppHost's `launchSettings.json` or as an environment variable:
```json title="Properties/launchSettings.json"
{
@@ -84,23 +87,17 @@ Set the `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` environment variable to `true` in
"https": {
"commandName": "Project",
"environmentVariables": {
- "ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE": "true"
+ "ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE": "false"
}
}
}
}
```
-When this setting is enabled:
-
-- Aspire checks for a trusted developer certificate.
-- If a trusted certificate is found, it is used to secure the DCP server.
-- If no trusted certificate is found, Aspire falls back to the DCP-generated ephemeral certificate.
-- This setting is only supported on Windows. On other platforms, a warning is logged and DCP falls back to its default ephemeral certificate.
-
## HTTPS endpoint configuration
@@ -135,8 +132,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -217,8 +214,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -333,8 +330,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -416,8 +413,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, CertificateTrustScope } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, CertificateTrustScope } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -473,8 +470,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, CertificateTrustScope } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, CertificateTrustScope } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -504,8 +501,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, CertificateTrustScope } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, CertificateTrustScope } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -621,8 +618,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -687,8 +684,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -723,8 +720,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, CertificateTrustScope } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, CertificateTrustScope } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/app-host/configuration.mdx b/src/frontend/src/content/docs/app-host/configuration.mdx
index 4d665aef4..c66c3dc32 100644
--- a/src/frontend/src/content/docs/app-host/configuration.mdx
+++ b/src/frontend/src/content/docs/app-host/configuration.mdx
@@ -1,6 +1,7 @@
---
title: AppHost configuration
-description: Learn about the Aspire AppHost configuration options.
+seoTitle: Aspire AppHost configuration reference and overview
+description: Configure the Aspire AppHost — environment variables, launch profiles, network ports, container runtime selection, and the options that change orchestration behavior.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -51,7 +52,7 @@ In TypeScript AppHosts, profiles live in `aspire.config.json`:
```json title="aspire.config.json"
{
"appHost": {
- "path": "apphost.ts",
+ "path": "apphost.mts",
"language": "typescript/nodejs"
},
"profiles": {
@@ -79,7 +80,7 @@ In TypeScript AppHosts, profiles live in `aspire.config.json`:
| ---------------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ASPIRE_ALLOW_UNSECURED_TRANSPORT` | `false` | Allows communication with the AppHost without https. `ASPNETCORE_URLS` (dashboard address) and `ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL` (AppHost resource service address) must be secured with HTTPS unless true. |
| `ASPIRE_CONTAINER_RUNTIME` | `docker` | Allows the user of alternative container runtimes for resources backed by containers. Possible values are `docker` (default) or `podman`. |
-| `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` | `false` | When set to `true`, Aspire uses its trusted developer certificate to secure the internal DCP server instead of an ephemeral certificate generated by DCP. This can help avoid certificate trust issues when the dev cert is already trusted. If no trusted developer certificate is found, Aspire falls back to the DCP-generated ephemeral certificate. Only supported on Windows. For more information, see [Certificate configuration](/app-host/certificate-configuration/). |
+| `ASPIRE_DCP_USE_DEVELOPER_CERTIFICATE` | `true` | When `true` (the default), Aspire uses the ASP.NET Core developer certificate to secure the internal DCP server instead of an ephemeral certificate generated by DCP. On Windows, Aspire passes the certificate thumbprint to DCP. On macOS and Linux, Aspire passes the certificate and private key file paths (plus the thumbprint) so DCP can verify the loaded certificate. Set to `false` to opt out and use DCP's default ephemeral certificate. If no trusted developer certificate is found, Aspire automatically falls back to the ephemeral certificate. For more information, see [Certificate configuration](/app-host/certificate-configuration/). |
| `ASPIRE_ENVIRONMENT` | `null` | Configures the AppHost environment when no higher-priority environment source is set. If no environment is configured, the AppHost uses `Production`. |
| `ASPIRE_VERSION_CHECK_DISABLED` | `false` | When set to `true`, Aspire doesn't check for newer versions on startup. |
diff --git a/src/frontend/src/content/docs/app-host/container-files.mdx b/src/frontend/src/content/docs/app-host/container-files.mdx
index ea2186027..8d841a49d 100644
--- a/src/frontend/src/content/docs/app-host/container-files.mdx
+++ b/src/frontend/src/content/docs/app-host/container-files.mdx
@@ -1,6 +1,7 @@
---
title: Container files
-description: Learn how to inject files and directories into containers at development time and publish time using the container file APIs in Aspire.
+seoTitle: Inject container files in your Aspire AppHost project
+description: Inject files and directories into Aspire container resources at development and publish time using WithContainerFiles, with options for source paths and permissions.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -346,8 +347,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -385,8 +386,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/app-host/container-registry.mdx b/src/frontend/src/content/docs/app-host/container-registry.mdx
index f93eefb79..3a8efc658 100644
--- a/src/frontend/src/content/docs/app-host/container-registry.mdx
+++ b/src/frontend/src/content/docs/app-host/container-registry.mdx
@@ -1,6 +1,7 @@
---
title: Container registry configuration
-description: Learn how to configure container registries for your Aspire applications, including generic registries and Azure Container Registry.
+seoTitle: Configure container registries for your Aspire AppHost
+description: Configure container registries for Aspire — generic registries, Docker Hub, Azure Container Registry, GitHub Container Registry, and per-resource image tagging.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -45,8 +46,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -84,8 +85,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -113,8 +114,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -144,8 +145,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -185,8 +186,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -270,8 +271,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -323,8 +324,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -426,8 +427,8 @@ var internalApi = builder.AddProject("internal-api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -472,8 +473,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -543,8 +544,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/app-host/docker-compose-to-apphost-reference.mdx b/src/frontend/src/content/docs/app-host/docker-compose-to-apphost-reference.mdx
index 999e63780..fa440161d 100644
--- a/src/frontend/src/content/docs/app-host/docker-compose-to-apphost-reference.mdx
+++ b/src/frontend/src/content/docs/app-host/docker-compose-to-apphost-reference.mdx
@@ -1,6 +1,6 @@
---
-title: Docker Compose to Aspire AppHost
-description: Quick reference for converting Docker Compose YAML syntax to Aspire AppHost API calls.
+title: Docker Compose to Aspire AppHost reference
+description: Quick reference for converting Docker Compose YAML syntax to Aspire AppHost API calls — services, networks, volumes, environment variables, and health checks.
---
import LearnMore from '@components/LearnMore.astro';
diff --git a/src/frontend/src/content/docs/app-host/eventing.mdx b/src/frontend/src/content/docs/app-host/eventing.mdx
index deaae65d9..7afd6e2c8 100644
--- a/src/frontend/src/content/docs/app-host/eventing.mdx
+++ b/src/frontend/src/content/docs/app-host/eventing.mdx
@@ -1,6 +1,7 @@
---
title: AppHost eventing APIs
-description: Learn how to use the Aspire AppHost eventing features for lifecycle events, custom event publishing, and event-driven resource orchestration.
+seoTitle: AppHost eventing APIs in your Aspire AppHost project
+description: Use the Aspire AppHost eventing APIs for lifecycle events, custom event publishing, and reactive integrations that respond to resource state transitions at runtime.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -16,7 +17,7 @@ The following events are available in the AppHost and occur in the following ord
1. `BeforeStartEvent`: This event is raised before the AppHost starts.
1. `ResourceEndpointsAllocatedEvent`: This event is raised per resource after its endpoints are allocated.
-1. `AfterResourcesCreatedEvent`: This event is raised after the AppHost created resources.
+1. `AfterResourcesCreatedEvent`: This event is raised after resources are created.
@@ -24,8 +25,9 @@ The following events are available in the AppHost and occur in the following ord
To subscribe to built-in AppHost events, use the convenience extension methods directly on the builder. These methods return the same `IDistributedApplicationBuilder` instance so calls can be chained:
-
-
+
+
+
```csharp title="AppHost.cs"
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@@ -39,16 +41,46 @@ builder.OnBeforeStart(static (@event, cancellationToken) =>
return Task.CompletedTask;
});
+builder.OnAfterResourcesCreated(static (@event, cancellationToken) =>
+{
+ var logger = @event.Services.GetRequiredService>();
+ logger.LogInformation("AfterResourcesCreatedEvent");
+ return Task.CompletedTask;
+});
+
builder.Build().Run();
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+await builder.subscribeBeforeStart(async () => {
+ console.log('BeforeStartEvent');
+});
+
+await builder.subscribeAfterResourcesCreated(async () => {
+ console.log('AfterResourcesCreatedEvent');
+});
+
+await builder.build().run();
+```
+
+
+
+
The following builder-level extension methods are available for AppHost events:
-| Method | Event |
-|--------|-------|
-| `OnBeforeStart` | `BeforeStartEvent` — raised before the AppHost starts |
-| `OnBeforePublish` | `BeforePublishEvent` — raised before manifest publishing begins |
-| `OnAfterPublish` | `AfterPublishEvent` — raised after manifest publishing completes |
+| Method | Event |
+| ------------------------- | ----------------------------------------------------------------- |
+| `OnBeforeStart` | `BeforeStartEvent` — raised before the AppHost starts |
+| `OnAfterResourcesCreated` | `AfterResourcesCreatedEvent` — raised after resources are created |
+| `OnBeforePublish` | `BeforePublishEvent` — raised before manifest publishing begins |
+| `OnAfterPublish` | `AfterPublishEvent` — raised after manifest publishing completes |
If you need to subscribe via `IDistributedApplicationEventing` directly (for example, inside an `IDistributedApplicationEventingSubscriber`), you can use the lower-level `Eventing.Subscribe()` API:
@@ -67,61 +99,39 @@ builder.Eventing.Subscribe(
var logger = @event.Services.GetRequiredService>();
logger.LogInformation("AfterResourcesCreatedEvent");
return Task.CompletedTask;
-
-builder.Build().Run();
+ });
```
-
-
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
-
-const builder = await createBuilder();
-const cache = await builder.addRedis("cache");
-
-await builder.subscribeBeforeStart(async (event) => {
- console.log("BeforeStartEvent");
-});
-
-await builder.subscribeAfterResourcesCreated(async (event) => {
- console.log("AfterResourcesCreatedEvent");
-});
-
-await builder.build().run();
-```
-
-
+
When the AppHost is run, by the time the Aspire dashboard is displayed, you should see the following log output in the console:
-```plaintext {2,10,12,14,16,22} data-disable-copy
+```plaintext {2,12} data-disable-copy
info: Program[0]
- 1. BeforeStartEvent
+ BeforeStartEvent
info: Aspire.Hosting.DistributedApplication[0]
Aspire version: 13.1.0
info: Aspire.Hosting.DistributedApplication[0]
Distributed application starting.
info: Aspire.Hosting.DistributedApplication[0]
Application host directory is: ../AspireApp/AspireApp.AppHost
-info: Program[0]
- 2. "cache" ResourceEndpointsAllocatedEvent
-info: Program[0]
- 2. "apiservice" ResourceEndpointsAllocatedEvent
-info: Program[0]
- 2. "webfrontend" ResourceEndpointsAllocatedEvent
-info: Program[0]
- 2. "aspire-dashboard" ResourceEndpointsAllocatedEvent
info: Aspire.Hosting.DistributedApplication[0]
Now listening on: https://localhost:17178
info: Aspire.Hosting.DistributedApplication[0]
Login to the dashboard at https://localhost:17178/login?t=
info: Program[0]
- 3. AfterResourcesCreatedEvent
+ AfterResourcesCreatedEvent
info: Aspire.Hosting.DistributedApplication[0]
Distributed application started. Press Ctrl+C to shut down.
```
-The log output confirms that event handlers are executed in the order of the AppHost life cycle events. The subscription order doesn't affect execution order. The `BeforeStartEvent` is triggered first, followed by each resource's `ResourceEndpointsAllocatedEvent`, and finally `AfterResourcesCreatedEvent`.
+The log output confirms that event handlers are executed in the order of the AppHost life cycle events. The subscription order doesn't affect execution order. The `BeforeStartEvent` is triggered before the AppHost starts, and `AfterResourcesCreatedEvent` is triggered after resources are created.
## Resource eventing
@@ -139,7 +149,10 @@ In addition to the AppHost events, you can also subscribe to resource events. Re
### Subscribe to resource events
-To subscribe to resource events, use the convenience-based extension methods—`On*`. After you have a distributed application builder instance, and a resource builder, walk up to the instance and chain a call to the desired `On*` event API. Consider the following sample _AppHost.cs_ file:
+To subscribe to resource events, use the convenience-based extension methods. After you have a distributed application builder instance, and a resource builder, walk up to the instance and chain a call to the desired event API:
+
+
+
```csharp title="AppHost.cs"
using Microsoft.Extensions.DependencyInjection;
@@ -206,13 +219,58 @@ builder.AddProject("webfrontend")
builder.Build().Run();
```
-The preceding code subscribes to the `InitializeResourceEvent`, `ResourceReadyEvent`, `ResourceEndpointsAllocatedEvent`, `ConnectionStringAvailableEvent`, and `BeforeResourceStartedEvent` events on the `cache` resource. When `AddRedis` is called, it returns an `IResourceBuilder` where `T` is a `RedisResource`. Chain calls to the `On*` methods to subscribe to the events. The `On*` methods return the same `IResourceBuilder` instance, so you can chain multiple calls:
+
+
-- `OnInitializeResource`: Subscribes to the `InitializeResourceEvent`.
-- `OnResourceEndpointsAllocated`: Subscribes to the `ResourceEndpointsAllocatedEvent` event.
-- `OnConnectionStringAvailable`: Subscribes to the `ConnectionStringAvailableEvent` event.
-- `OnBeforeResourceStarted`: Subscribes to the `BeforeResourceStartedEvent` event.
-- `OnResourceReady`: Subscribes to the `ResourceReadyEvent` event.
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis('cache');
+
+await cache.onInitializeResource(async () => {
+ console.log('1. onInitializeResource');
+});
+
+await cache.onResourceEndpointsAllocated(async (event) => {
+ const resource = await event.resource();
+ console.log(`2. endpoints allocated for ${resource.getResourceName()}`);
+});
+
+await cache.onConnectionStringAvailable(async (event) => {
+ const resource = await event.resource();
+ console.log(
+ `3. connection string available for ${resource.getResourceName()}`
+ );
+});
+
+await cache.onBeforeResourceStarted(async () => {
+ console.log('4. onBeforeResourceStarted');
+});
+
+await cache.onResourceReady(async () => {
+ console.log('5. onResourceReady');
+});
+
+await builder.build().run();
+```
+
+
+
+
+The preceding code subscribes to the `InitializeResourceEvent`, `ResourceReadyEvent`, `ResourceEndpointsAllocatedEvent`, `ConnectionStringAvailableEvent`, and `BeforeResourceStartedEvent` events on the `cache` resource. Chain calls to the event methods to subscribe to multiple events on the same resource.
+
+
+
+- `OnInitializeResource` / `onInitializeResource`: Subscribes to the `InitializeResourceEvent`.
+- `OnResourceEndpointsAllocated` / `onResourceEndpointsAllocated`: Subscribes to the `ResourceEndpointsAllocatedEvent` event.
+- `OnConnectionStringAvailable` / `onConnectionStringAvailable`: Subscribes to the `ConnectionStringAvailableEvent` event.
+- `OnBeforeResourceStarted` / `onBeforeResourceStarted`: Subscribes to the `BeforeResourceStartedEvent` event.
+- `OnResourceReady` / `onResourceReady`: Subscribes to the `ResourceReadyEvent` event.
When the AppHost is run, by the time the Aspire dashboard is displayed, you should see the following log output in the console:
@@ -242,7 +300,11 @@ info: Aspire.Hosting.DistributedApplication[0]
```
## Publish events
@@ -312,6 +374,30 @@ internal sealed class LifecycleLoggerSubscriber(ILogger
+ C# eventing subscriber service classes are specific to the C# AppHost hosting
+ model. TypeScript AppHosts can register callback-based subscribers with
+ `addEventingSubscriber` or `tryAddEventingSubscriber`.
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+builder.addEventingSubscriber(async (events) => {
+ events.onBeforeStart(async () => {
+ console.log('1. BeforeStartEvent');
+ });
+
+ events.onAfterResourcesCreated(async () => {
+ console.log('3. AfterResourcesCreatedEvent');
+ });
+});
+
+await builder.build().run();
+```
+
The subscriber approach keeps builder code minimal while still letting you respond to the same lifecycle moments as inline subscriptions:
- `AddEventingSubscriber()` (or `TryAddEventingSubscriber()`) ensures the subscriber participates whenever the AppHost starts.
@@ -324,12 +410,12 @@ Use this pattern whenever you previously relied on `IDistributedApplicationLifec
If you're migrating from the deprecated `IDistributedApplicationLifecycleHook` interface, use the following mapping:
-| Old pattern (deprecated) | New pattern |
-|--------------------------|-------------|
-| `BeforeStartAsync()` | Subscribe to `BeforeStartEvent` |
+| Old pattern (deprecated) | New pattern |
+| -------------------------------- | ---------------------------------------------- |
+| `BeforeStartAsync()` | Subscribe to `BeforeStartEvent` |
| `AfterEndpointsAllocatedAsync()` | Subscribe to `ResourceEndpointsAllocatedEvent` |
-| `AfterResourcesCreatedAsync()` | Subscribe to `AfterResourcesCreatedEvent` |
-| `TryAddLifecycleHook()` | `TryAddEventingSubscriber()` |
+| `AfterResourcesCreatedAsync()` | Subscribe to `AfterResourcesCreatedEvent` |
+| `TryAddLifecycleHook()` | `TryAddEventingSubscriber()` |
**Before (deprecated):**
@@ -374,7 +460,9 @@ builder.Services.TryAddEventingSubscriber();
```
## Additional events
@@ -385,10 +473,13 @@ Beyond the core lifecycle events, Aspire provides additional events for specific
When publishing your application (generating deployment manifests), these events are raised:
-| Event | When raised | Purpose |
-|-------|-------------|---------|
-| `BeforePublishEvent` | Before publishing begins | Validate or modify resources before manifest generation |
-| `AfterPublishEvent` | After publishing completes | Perform cleanup or post-publish actions |
+| Event | When raised | Purpose |
+| -------------------- | -------------------------- | ------------------------------------------------------- |
+| `BeforePublishEvent` | Before publishing begins | Validate or modify resources before manifest generation |
+| `AfterPublishEvent` | After publishing completes | Perform cleanup or post-publish actions |
+
+
+
```csharp title="AppHost.cs"
builder.OnBeforePublish((@event, ct) =>
@@ -404,14 +495,40 @@ builder.OnAfterPublish((@event, ct) =>
});
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+await builder.subscribeBeforePublish(async (event) => {
+ const model = await event.model();
+ console.log(`Publishing ${model.getResources().length} resources`);
+});
+
+await builder.subscribeAfterPublish(async (event) => {
+ const services = await event.services();
+ console.log('Publish completed', services);
+});
+```
+
+
+
+
-For details on what happens during publishing, see [Publishing and deployment overview](/deployment/deploy-with-aspire/).
+ For details on what happens during publishing, see [Publishing and deployment
+ overview](/deployment/deploy-with-aspire/).
### Resource stopped event
The `ResourceStoppedEvent` is raised when a resource stops execution:
+
+
+
```csharp title="AppHost.cs"
builder.Eventing.Subscribe(
cache,
@@ -422,8 +539,29 @@ builder.Eventing.Subscribe(
});
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis('cache');
+
+await cache.onResourceStopped(async (event) => {
+ const resource = await event.resource();
+ console.log(`Resource ${resource.getResourceName()} stopped`);
+});
+```
+
+
+
+
## See also
diff --git a/src/frontend/src/content/docs/app-host/executable-resources.mdx b/src/frontend/src/content/docs/app-host/executable-resources.mdx
index 036fec721..505629e87 100644
--- a/src/frontend/src/content/docs/app-host/executable-resources.mdx
+++ b/src/frontend/src/content/docs/app-host/executable-resources.mdx
@@ -1,6 +1,6 @@
---
title: Host external executables in Aspire
-description: Learn how to host external executable applications in your Aspire AppHost using AddExecutable.
+description: Host external executable applications in your Aspire AppHost using AddExecutable — model CLI tools, daemons, and language runtimes alongside containers and projects.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -43,8 +43,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -78,8 +78,8 @@ var app = builder.AddExecutable(
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -107,8 +107,8 @@ var app = builder.AddExecutable("worker", "python", ".", "worker.py")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -146,8 +146,8 @@ var app = builder.AddExecutable("app", "node", ".", "app.js")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -187,8 +187,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -225,8 +225,8 @@ var e2eTests = builder.AddExecutable("playwright", "npx", ".", "playwright", "te
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -261,8 +261,8 @@ var app = builder.AddExecutable(
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -289,8 +289,8 @@ var app = builder.AddExecutable(
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -328,8 +328,8 @@ var app = builder.AddExecutable("frontend", "npm", ".", "start")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/app-host/hot-reload-and-watch.mdx b/src/frontend/src/content/docs/app-host/hot-reload-and-watch.mdx
index cee1742e2..8b65e3886 100644
--- a/src/frontend/src/content/docs/app-host/hot-reload-and-watch.mdx
+++ b/src/frontend/src/content/docs/app-host/hot-reload-and-watch.mdx
@@ -1,6 +1,7 @@
---
title: Hot Reload and watch
-description: Learn how hot reload works in Aspire.
+seoTitle: Aspire AppHost hot reload and aspire watch overview
+description: "Learn how hot reload works in Aspire and how `aspire watch` rebuilds and restarts resources automatically when project files change during development."
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
@@ -78,7 +79,7 @@ TypeScript AppHost watch doesn't automatically provide hot reload for every reso
Use this workflow when changes affect:
-- The AppHost model in `apphost.ts`.
+- The AppHost model in `apphost.mts`.
- Resource configuration, endpoints, parameters, or integration setup.
- Multiple services that need to be restarted together under Aspire orchestration.
diff --git a/src/frontend/src/content/docs/app-host/migrate-from-docker-compose.mdx b/src/frontend/src/content/docs/app-host/migrate-from-docker-compose.mdx
index cb8b862ea..79f109372 100644
--- a/src/frontend/src/content/docs/app-host/migrate-from-docker-compose.mdx
+++ b/src/frontend/src/content/docs/app-host/migrate-from-docker-compose.mdx
@@ -1,6 +1,6 @@
---
title: Migrate from Docker Compose to Aspire
-description: Learn how to migrate your Docker Compose applications to Aspire and understand the key conceptual differences.
+description: Migrate your Docker Compose applications to Aspire — map services, volumes, networks, and environment variables to AppHost APIs and modernize your developer workflow.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -124,8 +124,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -238,8 +238,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -329,8 +329,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -382,7 +382,7 @@ var app = builder.AddContainer("app", "myapp", "latest")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const dbPassword = builder.addParameter("dbPassword", { secret: true });
const db = (await builder.addPostgres("db", { password: dbPassword }))
@@ -440,8 +440,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -578,7 +578,7 @@ var app = builder.AddContainer("app", "myapp", "latest")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const dbPassword = builder.addParameter("dbPassword", { secret: true });
const postgres = (await builder.addPostgres("db", { password: dbPassword }))
@@ -607,7 +607,7 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const api = await builder.addProject("api", "./Api/Api.csproj", "https")
.withReference(database) // Service discovery
.waitFor(database); // Startup ordering
@@ -635,7 +635,7 @@ var redis = builder.AddRedis("cache")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const redis = await builder.addRedis("cache")
.withHostPort(6379);
```
@@ -656,7 +656,7 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const api = await builder.addProject("api", "./Api/Api.csproj", "https")
.withHttpHealthCheck("/health");
```
@@ -685,7 +685,7 @@ var app = builder.AddProject("app")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const rabbit = await builder.addContainer("rabbitmq", "rabbitmq", "4.1.4-management-alpine")
.withHealthCheck("rabbitmq-health");
diff --git a/src/frontend/src/content/docs/app-host/persistent-containers.mdx b/src/frontend/src/content/docs/app-host/persistent-containers.mdx
index ed4f97630..22a702ac4 100644
--- a/src/frontend/src/content/docs/app-host/persistent-containers.mdx
+++ b/src/frontend/src/content/docs/app-host/persistent-containers.mdx
@@ -1,6 +1,7 @@
---
title: Persistent container lifetimes
-description: Learn how to configure containers to persist and be re-used between Aspire AppHost runs.
+seoTitle: Persistent container lifetimes in your Aspire AppHost
+description: Configure Aspire containers to persist and be re-used between AppHost runs so databases, caches, and message brokers keep their data and accelerate the inner loop.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -38,8 +39,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -109,8 +110,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -176,7 +177,7 @@ var postgres = builder.AddPostgres("postgres")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const postgres = await builder.addPostgres("postgres")
.withLifetime(ContainerLifetime.Persistent)
.withDataVolume();
diff --git a/src/frontend/src/content/docs/app-host/typescript-apphost.mdx b/src/frontend/src/content/docs/app-host/typescript-apphost.mdx
index 37009fc3b..dc936b3fa 100644
--- a/src/frontend/src/content/docs/app-host/typescript-apphost.mdx
+++ b/src/frontend/src/content/docs/app-host/typescript-apphost.mdx
@@ -1,24 +1,43 @@
---
title: TypeScript AppHost project structure
-description: Learn about the files and configuration that make up a TypeScript AppHost project.
+seoTitle: Aspire TypeScript AppHost project structure overview
+description: Learn the files and configuration that make up a TypeScript AppHost project — entry point, package manifest, dependencies, and how the AppHost runs Aspire resources.
---
import { Aside, FileTree, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
import LearnMore from '@components/LearnMore.astro';
-When you create a TypeScript AppHost with `aspire new` or `aspire init --language typescript`, the CLI scaffolds a project with the following structure:
+When you create a TypeScript AppHost with `aspire new`, the CLI scaffolds a project with the following structure:
- my-apphost/
- - .modules/ Generated TypeScript SDK (do not edit)
- - aspire.ts
- - base.ts
- - transport.ts
- - apphost.ts Your AppHost entry point
+ - .aspire/modules/ Generated TypeScript SDK (do not edit)
+ - aspire.mts
+ - base.mts
+ - transport.mts
+ - apphost.mts Your AppHost entry point
- aspire.config.json Aspire configuration
- package.json
- - tsconfig.json
+ - tsconfig.apphost.json
+
+
+
+When you run `aspire init --language typescript` in an existing JavaScript or TypeScript app that already has a root `package.json`, Aspire creates the AppHost in a nested `aspire-apphost/` package. The root `aspire.config.json` points to `aspire-apphost/apphost.mts`, and the root `package.json` gets Aspire delegate scripts so the existing app package keeps its own module and toolchain settings:
+
+
+
+- my-existing-app/
+ - aspire-apphost/
+ - .aspire/modules/ Generated TypeScript SDK (do not edit)
+ - aspire.mts
+ - base.mts
+ - transport.mts
+ - apphost.mts Your AppHost entry point
+ - package.json
+ - tsconfig.apphost.json
+ - aspire.config.json Aspire configuration
+ - package.json Existing app package with Aspire delegate scripts
@@ -29,7 +48,7 @@ The `aspire.config.json` file is the central configuration for your AppHost. It
```json title="aspire.config.json"
{
"appHost": {
- "path": "apphost.ts",
+ "path": "apphost.mts",
"language": "typescript/nodejs"
},
"packages": {
@@ -51,20 +70,20 @@ The `aspire.config.json` file is the central configuration for your AppHost. It
| Section | Description |
|---------|-------------|
-| `appHost.path` | Path to your AppHost entry point (`apphost.ts`) |
+| `appHost.path` | Path to your AppHost entry point (`apphost.mts`) |
| `appHost.language` | Language runtime (`typescript/nodejs`) |
| `packages` | Hosting integration packages and their versions. Added automatically by `aspire add`. |
| `profiles` | Launch profiles with dashboard URLs and environment variables |
-### Adding integrations
+### Add and restore integrations
-When you run `aspire add`, the CLI adds the package to the `packages` section and regenerates the TypeScript SDK:
+Use `aspire add` from the AppHost root to add hosting integrations. The CLI adds the package to the `packages` section, restores AppHost dependencies, and regenerates the TypeScript SDK in `.aspire/modules/`:
```bash title="Add an integration"
aspire add redis
```
-This updates `aspire.config.json`:
+This updates `aspire.config.json` so the package is restored the next time the AppHost runs:
```json title="aspire.config.json" ins={4}
{
@@ -75,6 +94,12 @@ This updates `aspire.config.json`:
}
```
+Run `aspire restore` when you want to regenerate `.aspire/modules/` without starting the AppHost, such as after switching branches, updating package versions, or preparing a CI job:
+
+```bash title="Restore a TypeScript AppHost"
+aspire restore
+```
+
### Project references for local development
You can reference a local hosting integration project by using a `.csproj` path instead of a version:
@@ -91,15 +116,15 @@ You can reference a local hosting integration project by using a `.csproj` path
See [Multi-language integrations](/extensibility/multi-language-integration-authoring/) for details on building hosting integrations that work with TypeScript AppHosts.
-## .modules/ directory
+## .aspire/modules/ directory
-The `.modules/` directory contains the generated TypeScript SDK. It's created and updated automatically by the Aspire CLI — **do not edit these files**.
+The `.aspire/modules/` directory under the AppHost root contains the generated TypeScript SDK. It's created and updated automatically by the Aspire CLI — **do not edit these files**.
| File | Purpose |
|------|---------|
-| `aspire.ts` | Generated typed API for all your installed integrations |
-| `base.ts` | Base types and handle infrastructure |
-| `transport.ts` | JSON-RPC transport layer |
+| `aspire.mts` | Generated typed API for all your installed integrations |
+| `base.mts` | Base types and handle infrastructure |
+| `transport.mts` | JSON-RPC transport layer |
The SDK regenerates when:
@@ -107,22 +132,22 @@ The SDK regenerates when:
- You run `aspire run` or `aspire start` and the package list has changed
- You run `aspire restore` to manually regenerate
-Your `apphost.ts` imports from this SDK:
+Your `apphost.mts` imports from this SDK:
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
```
-## apphost.ts
+## apphost.mts
The entry point for your AppHost. This is where you define your application's resources and their relationships:
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,23 +161,124 @@ const api = await builder
await builder.build().run();
```
+## Legacy `apphost.ts` projects (pre-13.4)
+
+TypeScript AppHosts scaffolded by Aspire CLI versions earlier than 13.4 use a slightly different layout: the entry point was `apphost.ts` (not `apphost.mts`), and the generated TypeScript SDK lives in `./.modules/` (not `./.aspire/modules/`):
+
+
+
+- my-apphost/
+ - .modules/ Generated TypeScript SDK (do not edit)
+ - aspire.ts
+ - base.ts
+ - transport.ts
+ - apphost.ts Your AppHost entry point
+ - aspire.config.json Aspire configuration
+ - package.json
+ - tsconfig.apphost.json
+
+
+
+The pre-13.4 entry point imports the SDK with the `.js` extension:
+
+```typescript title="apphost.ts (pre-13.4)"
+import { createBuilder } from './.modules/aspire.js';
+```
+
+### Compatibility in 13.4
+
+The 13.4 Aspire CLI keeps these projects working without any changes:
+
+- When the CLI sees an `apphost.ts` file with no `apphost.mts` alongside it — either because `aspire.config.json` sets `appHost.path` to `apphost.ts`, or because a disk scan finds `apphost.ts` and no `apphost.mts` — it switches to the legacy output layout for that project.
+- Generated SDK files are written to `./.modules/` instead of `./.aspire/modules/`.
+- Generated files are rewritten from `.mts`/`.mjs` to `.ts`/`.js`, including the inter-module import specifiers inside the SDK, so the existing `./.modules/aspire.js` import in your `apphost.ts` continues to resolve.
+
+`aspire add`, `aspire restore`, `aspire run`, and `aspire start` all continue to work against an existing `apphost.ts` project with no edits required.
+
+
+
+### Migrating to the new `apphost.mts` layout
+
+If you'd like to move an existing project to the new default layout, the migration is mechanical. The steps below assume an AppHost root with `apphost.ts`, `./.modules/`, and the legacy `appHost.path` value:
+
+
+
+1. **Rename the entry point file.**
+
+ ```bash
+ git mv apphost.ts apphost.mts
+ ```
+
+2. **Update the SDK import** in `apphost.mts` to use the new folder and the `.mjs` extension:
+
+ ```typescript title="apphost.mts" del={1} ins={2}
+ import { createBuilder } from './.modules/aspire.js';
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
+ ```
+
+3. **Update `appHost.path`** in `aspire.config.json`:
+
+ ```json title="aspire.config.json" del={3} ins={4}
+ {
+ "appHost": {
+ "path": "apphost.ts",
+ "path": "apphost.mts",
+ "language": "typescript/nodejs"
+ }
+ }
+ ```
+
+4. **Update `tsconfig.apphost.json`** so its `include` (and any related glob) entries point at the new file and folder. Replace references to `apphost.ts` with `apphost.mts`, and references to `.modules/` with `.aspire/modules/`. For example:
+
+ ```json title="tsconfig.apphost.json" del={4,5} ins={6,7}
+ {
+ "compilerOptions": { /* ... */ },
+ "include": [
+ "apphost.ts",
+ ".modules/**/*.ts",
+ "apphost.mts",
+ ".aspire/modules/**/*.mts"
+ ]
+ }
+ ```
+
+5. **Delete the old generated SDK folder and regenerate.** The CLI now writes the SDK under `./.aspire/modules/`, so the old folder is no longer used:
+
+ ```bash
+ rm -rf .modules
+ aspire restore
+ ```
+
+ If your `.gitignore` ignores `.modules/`, replace that entry with `.aspire/` (or `.aspire/modules/`) to match the new location.
+
+
+
+After migrating, `aspire run` behaves exactly the same as before — the CLI now uses the modern output path because `apphost.mts` is present.
+
## Package managers
-The Aspire CLI automatically detects which package manager your TypeScript AppHost uses by inspecting lock files and the `packageManager` field in `package.json`. The following package managers are supported:
+The Aspire CLI supports the following package managers at the **AppHost root** — the directory that contains your `apphost.mts` and `aspire.config.json`. The CLI selects between them by inspecting package manager signals, including the `packageManager` field in `package.json`, lock files, and package manager configuration in the AppHost root.
-| Package manager | Lock file detected | Notes |
+| Package manager | Detection signals | Version expectation |
|---|---|---|
-| npm | `package-lock.json` | Default; no extra setup required |
-| pnpm | `pnpm-lock.yaml` | |
-| Yarn (v4+) | `yarn.lock` | Must be Yarn 4 or later (Berry) |
-| Bun | `bun.lock` / `bun.lockb` | |
+| npm | `packageManager`, `package-lock.json`, or no other signal | npm 10 or later; npm is the default |
+| pnpm | `packageManager` or `pnpm-lock.yaml` | pnpm 10 or later |
+| Yarn | `packageManager`, `yarn.lock`, `.yarnrc.yml`, or `.yarn/` | Yarn 4 or later (Berry) |
+| Bun | `packageManager`, `bun.lock`, or `bun.lockb` | Bun 1.2 or later |
+| Yarn Classic (v1) | `yarn.lock` with `# yarn lockfile v1` or `packageManager` with `yarn@1.x` | Not supported |
+
+This policy governs the **AppHost root only**. Apps the AppHost orchestrates — for example, a Node.js service added with `addNodeApp`, a Bun guest app, or a workspace package — can use any package manager their own tooling requires; they are independent of the AppHost-root toolchain.
+
+Aspire end-to-end tests cover TypeScript AppHosts with representative `packageManager` pins such as `npm@10.0.0`, `pnpm@10.0.0`, `yarn@4.14.1`, and `bun@1.2.0`. These tested versions are representative points within the supported ranges, not the only versions you can use.
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -285,8 +353,8 @@ var container = builder.AddDockerfile("mygoapp", "relative/context/path")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -337,8 +405,8 @@ var container = builder.AddDockerfile("myapp", "relative/context/path")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/architecture/multi-language-architecture.mdx b/src/frontend/src/content/docs/architecture/multi-language-architecture.mdx
index ef2c28aab..80fe9d4b2 100644
--- a/src/frontend/src/content/docs/architecture/multi-language-architecture.mdx
+++ b/src/frontend/src/content/docs/architecture/multi-language-architecture.mdx
@@ -1,6 +1,7 @@
---
title: Multi-language architecture
-description: Understand how Aspire uses a guest/host architecture, ATS, SDK generation, and local token-based authentication to support multi-language AppHosts.
+seoTitle: 'Aspire multi-language architecture: C# and TypeScript'
+description: Understand how Aspire uses a guest/host architecture, ATS, SDK generation, and local token-based auth to bring TypeScript, Python, and Java apps into the AppHost.
---
import LearnMore from '@components/LearnMore.astro';
@@ -17,7 +18,7 @@ Instead, guest languages only declare resources such as `addRedis`, `addPostgres
When you run a TypeScript AppHost, the Aspire CLI orchestrates two processes:
-- **Guest**: your `apphost.ts` process, running in Node.js
+- **Guest**: your `apphost.mts` process, running in Node.js
- **Host**: the Aspire orchestration server, running on .NET
The guest communicates with the host via JSON-RPC over a local transport: Unix sockets on macOS and Linux, and named pipes on Windows. Your code calls methods such as `addRedis()` or `withReference()`, and the generated SDK translates those calls into RPC requests.
@@ -25,8 +26,8 @@ The guest communicates with the host via JSON-RPC over a local transport: Unix s
```mermaid
flowchart TB
subgraph Guest["Guest Process (Node.js)"]
- TS["apphost.ts"]
- SDK["Generated SDK (.modules/)"]
+ TS["apphost.mts"]
+ SDK["Generated SDK (.aspire/modules/)"]
Client["JSON-RPC Client"]
TS --> SDK --> Client
end
@@ -51,7 +52,7 @@ flowchart TB
## Startup sequence
1. The CLI prepares the host process with the required hosting packages.
-2. The ATS scanner inspects assemblies for exports and generates the TypeScript SDK into `.modules/`.
+2. The ATS scanner inspects assemblies for exports and generates the TypeScript SDK into `.aspire/modules/`.
3. The CLI starts the host process and creates the local socket or pipe endpoint.
4. The CLI starts the guest process and passes connection details through environment variables.
5. The guest connects and invokes capabilities such as `createBuilder`, `addRedis`, `build`, and `run`.
@@ -107,7 +108,7 @@ The TypeScript SDK is generated from hosting integration assemblies. When you ad
1. Loads the integration assembly.
2. Scans exported methods and types.
3. Applies ATS rules, including polymorphism flattening.
-4. Emits typed TypeScript wrappers into `.modules/`.
+4. Emits typed TypeScript wrappers into `.aspire/modules/`.
This keeps the SDK in sync with the .NET implementation. Integration authors do not hand-write TypeScript bindings; they export their .NET APIs and the CLI generates the guest surface automatically.
diff --git a/src/frontend/src/content/docs/architecture/overview.mdx b/src/frontend/src/content/docs/architecture/overview.mdx
index 56f9dedc4..98ec17134 100644
--- a/src/frontend/src/content/docs/architecture/overview.mdx
+++ b/src/frontend/src/content/docs/architecture/overview.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire architecture
-description: Learn about the overall architecture of Aspire, including its integrations, orchestration, and networking capabilities.
+title: Aspire architecture overview
+description: Learn the overall architecture of Aspire — the AppHost, resource model, orchestration, networking, dashboard, and how multi-language integrations fit together.
---
diff --git a/src/frontend/src/content/docs/architecture/resource-api-patterns.mdx b/src/frontend/src/content/docs/architecture/resource-api-patterns.mdx
index 5a71d18c7..9b48d32c5 100644
--- a/src/frontend/src/content/docs/architecture/resource-api-patterns.mdx
+++ b/src/frontend/src/content/docs/architecture/resource-api-patterns.mdx
@@ -1,6 +1,7 @@
---
title: Resource API Patterns
-description: Discover common API resource patterns in Aspire, including how to add and configure resources, use annotations, and implement custom value objects.
+seoTitle: Aspire resource API patterns for AppHost integrations
+description: Discover common API resource patterns in Aspire, including how to add and configure resources, use annotations, and compose hosting and client integrations.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/architecture/resource-examples.mdx b/src/frontend/src/content/docs/architecture/resource-examples.mdx
index d2318d703..339d522a2 100644
--- a/src/frontend/src/content/docs/architecture/resource-examples.mdx
+++ b/src/frontend/src/content/docs/architecture/resource-examples.mdx
@@ -1,6 +1,7 @@
---
title: Examples
-description: Explore complete, runnable examples demonstrating key concepts in Aspire.
+seoTitle: Aspire resource model examples for AppHost authors
+description: "Explore complete, runnable examples that demonstrate Aspire's resource model — custom container resources, connection strings, health checks, and event subscriptions."
next: false
---
diff --git a/src/frontend/src/content/docs/architecture/resource-hierarchies.mdx b/src/frontend/src/content/docs/architecture/resource-hierarchies.mdx
index 9eab24541..2cb76b7b8 100644
--- a/src/frontend/src/content/docs/architecture/resource-hierarchies.mdx
+++ b/src/frontend/src/content/docs/architecture/resource-hierarchies.mdx
@@ -1,6 +1,7 @@
---
title: Resource Hierarchies
-description: Learn how Aspire manages resources and their dependencies in your application.
+seoTitle: Aspire resource parent-child hierarchies in AppHost
+description: Model parent-child resource relationships in Aspire to express ownership, lifecycle containment, and dashboard grouping for distributed application topologies.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -433,8 +434,8 @@ builder.AddProject("worker")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/architecture/resource-model.mdx b/src/frontend/src/content/docs/architecture/resource-model.mdx
index 09b0a180b..32db862bc 100644
--- a/src/frontend/src/content/docs/architecture/resource-model.mdx
+++ b/src/frontend/src/content/docs/architecture/resource-model.mdx
@@ -1,6 +1,7 @@
---
title: Resource Model
-description: Learn how Aspire's resource model simplifies the development and management of distributed applications.
+seoTitle: Aspire resource model and dependency DAG explained
+description: "Learn how Aspire's resource model represents distributed apps as a directed acyclic graph of services, containers, executables, and integrations in the AppHost."
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/architecture/resource-publishing.mdx b/src/frontend/src/content/docs/architecture/resource-publishing.mdx
index f1663df27..682c9b71d 100644
--- a/src/frontend/src/content/docs/architecture/resource-publishing.mdx
+++ b/src/frontend/src/content/docs/architecture/resource-publishing.mdx
@@ -1,5 +1,7 @@
---
title: Resource Publishing
+seoTitle: Publish Aspire resource manifests from your AppHost
+description: Learn how Aspire publishes resource manifests as JSON for deployment tooling, including manifest annotations, value providers, and structured field expressions.
---
import { Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/aspireconf/index.mdx b/src/frontend/src/content/docs/aspireconf/index.mdx
index 3b5c9d6de..d2aead041 100644
--- a/src/frontend/src/content/docs/aspireconf/index.mdx
+++ b/src/frontend/src/content/docs/aspireconf/index.mdx
@@ -1,5 +1,6 @@
---
title: That's a wrap!
+seoTitle: Aspire Conf 2026 — celebrating the Aspire 13.3 release
prev: false
next: false
giscus: false
@@ -7,7 +8,7 @@ crumbs: false
head:
- tag: title
content: Aspire Conf — Thank you for watching!
-description: Thank you for joining us and celebrating the release of Aspire 13.3. Watch the replay on YouTube and connect with us on Discord, X, and BlueSky.
+description: "Watch the Aspire Conf replays celebrating Aspire 13.3. Connect with the team and community across Discord, X, and BlueSky for sessions, demos, and Q&A."
template: splash
editUrl: false
hero:
diff --git a/src/frontend/src/content/docs/community/contributor-guide.mdx b/src/frontend/src/content/docs/community/contributor-guide.mdx
index 8ec3336b3..1f476bfc6 100644
--- a/src/frontend/src/content/docs/community/contributor-guide.mdx
+++ b/src/frontend/src/content/docs/community/contributor-guide.mdx
@@ -1,5 +1,6 @@
---
title: Contributor guide for aspire.dev
+description: "Learn how to contribute to aspire.dev: clone the repo, run the docs site locally, write Starlight MDX, follow the style guide, and open a pull request."
tableOfContents:
minHeadingLevel: 2
maxHeadingLevel: 3
@@ -751,8 +752,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/community/contributors.mdx b/src/frontend/src/content/docs/community/contributors.mdx
index 172c77f01..04c15e21c 100644
--- a/src/frontend/src/content/docs/community/contributors.mdx
+++ b/src/frontend/src/content/docs/community/contributors.mdx
@@ -1,6 +1,7 @@
---
-title: Contributors 🤝
-description: We're grateful for the contributions of our community members who help make Aspire better every day.
+title: Contributors 🤝
+seoTitle: Aspire contributors and the open-source community team
+description: Meet the contributors who help make Aspire better every day. Explore the global community of engineers, writers, and translators powering the Aspire ecosystem.
lastUpdated: false
editUrl: false
giscus: false
diff --git a/src/frontend/src/content/docs/community/index.mdx b/src/frontend/src/content/docs/community/index.mdx
index baa7a9536..ec45a3b67 100644
--- a/src/frontend/src/content/docs/community/index.mdx
+++ b/src/frontend/src/content/docs/community/index.mdx
@@ -1,10 +1,10 @@
---
-title: Aspire Community
+title: Aspire community channels and links
prev:
link: /reference/overview/
label: Reference
next: false
-description: Connect with the Aspire team and community across social channels, streams, and contribution platforms.
+description: Connect with the Aspire team and community across Discord, GitHub Discussions, livestreams, social channels, and contribution platforms for distributed apps.
banner:
content: |
Aspire 13.3 is here! — See what's new
diff --git a/src/frontend/src/content/docs/community/thanks.mdx b/src/frontend/src/content/docs/community/thanks.mdx
index d663c2560..331807b5e 100644
--- a/src/frontend/src/content/docs/community/thanks.mdx
+++ b/src/frontend/src/content/docs/community/thanks.mdx
@@ -1,6 +1,7 @@
---
title: Thank you
-description: Celebrating the open-source projects and communities that make Aspire possible.
+seoTitle: Open-source projects that power the Aspire ecosystem
+description: Celebrate the open-source projects, libraries, and communities that make Aspire possible, from OpenTelemetry to the broader cloud-native ecosystem.
editUrl: false
giscus: false
tableOfContents: false
@@ -803,7 +804,7 @@ Aspire speaks many languages — thanks to these communities.
alongside Aspire.
Orkestrér frontends, APIs, containere og databaser ubesværet—ingen omskrivninger, ingen grænser. Udvid Aspire til at drive ethvert projekt.
image:
diff --git a/src/frontend/src/content/docs/dashboard/ai-coding-agents.mdx b/src/frontend/src/content/docs/dashboard/ai-coding-agents.mdx
index 09e89ce91..57862efee 100644
--- a/src/frontend/src/content/docs/dashboard/ai-coding-agents.mdx
+++ b/src/frontend/src/content/docs/dashboard/ai-coding-agents.mdx
@@ -1,6 +1,7 @@
---
title: Dashboard and AI coding agents
-description: Learn how AI coding agents use the Aspire CLI and MCP server to fetch logs and telemetry from the Aspire dashboard when adding features and fixing bugs.
+seoTitle: Aspire dashboard and AI coding agents for distributed apps
+description: Learn how AI coding agents use the Aspire CLI and MCP server to read logs and telemetry from the Aspire dashboard, diagnose failures, and propose code changes.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/dashboard/apis.mdx b/src/frontend/src/content/docs/dashboard/apis.mdx
index 3c951dc43..a6e1e205a 100644
--- a/src/frontend/src/content/docs/dashboard/apis.mdx
+++ b/src/frontend/src/content/docs/dashboard/apis.mdx
@@ -1,6 +1,7 @@
---
title: APIs and data access
-description: Reference for the Aspire dashboard write and read APIs, including OTLP endpoints, HTTP telemetry API, and Aspire CLI commands.
+seoTitle: Aspire dashboard APIs and OpenTelemetry data access
+description: Reference for the Aspire dashboard read and write APIs — OTLP endpoints, HTTP telemetry APIs, gRPC resource service, and authentication for programmatic access.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/dashboard/configuration.mdx b/src/frontend/src/content/docs/dashboard/configuration.mdx
index 68d0f5d74..2ea5a498a 100644
--- a/src/frontend/src/content/docs/dashboard/configuration.mdx
+++ b/src/frontend/src/content/docs/dashboard/configuration.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire dashboard configuration
-description: Aspire dashboard configuration options
+title: Aspire dashboard configuration reference
+description: Configuration reference for the Aspire dashboard — OTLP endpoints, frontend authentication, resource service, telemetry limits, and standalone deployment options.
---
import { Aside } from '@astrojs/starlight/components';
@@ -282,6 +282,7 @@ Telemetry limits have different scopes depending upon the telemetry type:
| `Dashboard:AI:Disabled` Default: `true` | Reserved for future use. The in-dashboard GitHub Copilot UI was removed in Aspire 13.3. AI coding agents can still access telemetry data via the [Aspire CLI and MCP server](/dashboard/ai-coding-agents/). |
| `Dashboard:UI:DisableResourceGraph` Default: `false` | Disables displaying the resource graph UI in the dashboard. |
| `Dashboard:UI:DisableImport` Default: `false` | Disables the telemetry import UI in the dashboard. |
+| `Dashboard:UI:DisableAgentHelp` Default: `false` | Disables the **AI Agents** button in the dashboard header. When `false`, a button is shown in the header that opens a dialog with instructions for using AI coding agents with the dashboard. |
## Next steps
diff --git a/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx b/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx
index ad86055dd..f381161cb 100644
--- a/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx
+++ b/src/frontend/src/content/docs/dashboard/enable-browser-telemetry.mdx
@@ -1,6 +1,8 @@
---
title: Enable browser telemetry
-description: Learn how to enable browser telemetry in the Aspire dashboard.
+seoTitle: Enable browser telemetry in the Aspire dashboard today
+description: Enable browser telemetry in the Aspire dashboard to capture client-side OpenTelemetry logs, traces, and metrics from front-end JavaScript apps.
+
---
import LearnMore from '@components/LearnMore.astro';
diff --git a/src/frontend/src/content/docs/dashboard/explore.mdx b/src/frontend/src/content/docs/dashboard/explore.mdx
index 9701ba241..383e61f67 100644
--- a/src/frontend/src/content/docs/dashboard/explore.mdx
+++ b/src/frontend/src/content/docs/dashboard/explore.mdx
@@ -1,6 +1,6 @@
---
-title: Explore Aspire dashboard
-description: Explore the Aspire dashboard features through the Aspire Starter app.
+title: Explore the Aspire dashboard with the Starter app
+description: Explore Aspire dashboard features — resource graph, console logs, traces, metrics, and the GenAI visualizer — using the Aspire Starter app as a guided tour.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/dashboard/index.mdx b/src/frontend/src/content/docs/dashboard/index.mdx
index 2413337cb..f40e68950 100644
--- a/src/frontend/src/content/docs/dashboard/index.mdx
+++ b/src/frontend/src/content/docs/dashboard/index.mdx
@@ -1,12 +1,12 @@
---
-title: Aspire Dashboard
+title: Aspire dashboard for distributed apps
prev:
link: /integrations/
label: Integrations
next:
link: /deployment/
label: Deployment
-description: Monitor, debug, and manage your distributed applications with the Aspire Dashboard — real-time telemetry, structured logs, traces, and AI-powered insights.
+description: Monitor, debug, and manage your distributed applications with the Aspire dashboard — real-time telemetry, resource graphs, console logs, and OpenTelemetry support.
editUrl: false
tableOfContents: false
pageActions: false
diff --git a/src/frontend/src/content/docs/dashboard/microsoft-collected-dashboard-telemetry.mdx b/src/frontend/src/content/docs/dashboard/microsoft-collected-dashboard-telemetry.mdx
index fdff8f2c6..57bbcf6c5 100644
--- a/src/frontend/src/content/docs/dashboard/microsoft-collected-dashboard-telemetry.mdx
+++ b/src/frontend/src/content/docs/dashboard/microsoft-collected-dashboard-telemetry.mdx
@@ -1,7 +1,8 @@
---
title: Microsoft-collected dashboard telemetry
+seoTitle: Microsoft-collected Aspire dashboard telemetry overview
next: false
-description: Learn about what telemetry the Aspire dashboard sends and how to opt out.
+description: Learn what telemetry the Aspire dashboard sends to Microsoft, how the data is used to improve the product, and how to opt out in standalone and AppHost deployments.
---
import OsAwareTabs from '@components/OsAwareTabs.astro';
diff --git a/src/frontend/src/content/docs/dashboard/overview.mdx b/src/frontend/src/content/docs/dashboard/overview.mdx
index c118fff8f..8777c3707 100644
--- a/src/frontend/src/content/docs/dashboard/overview.mdx
+++ b/src/frontend/src/content/docs/dashboard/overview.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire dashboard overview
-description: Overview of Aspire dashboard and getting started.
+title: Aspire dashboard overview and getting started
+description: Overview of the Aspire dashboard — what it shows, how the AppHost wires it up, and how to start using it for telemetry, resource management, and debugging.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/dashboard/security-considerations.mdx b/src/frontend/src/content/docs/dashboard/security-considerations.mdx
index 626b798f2..97d2bbee0 100644
--- a/src/frontend/src/content/docs/dashboard/security-considerations.mdx
+++ b/src/frontend/src/content/docs/dashboard/security-considerations.mdx
@@ -1,6 +1,6 @@
---
title: Aspire dashboard security considerations
-description: Security considerations for running the Aspire dashboard
+description: Security considerations for running the Aspire dashboard — authentication, network exposure, OTLP and resource service endpoints, and standalone hardening guidance.
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx b/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx
index 736a08671..ae93b0c02 100644
--- a/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx
+++ b/src/frontend/src/content/docs/dashboard/standalone-for-nodejs.mdx
@@ -1,6 +1,6 @@
---
-title: Use the Aspire dashboard with Node.js apps
-description: How to use the Aspire Dashboard in a Node.js application.
+title: Aspire dashboard standalone for Node.js apps
+description: Use the Aspire dashboard standalone with Node.js applications — wire up OpenTelemetry, point OTLP exporters at the dashboard, and visualize logs, traces, and metrics.
---
diff --git a/src/frontend/src/content/docs/dashboard/standalone-for-python.mdx b/src/frontend/src/content/docs/dashboard/standalone-for-python.mdx
index c05c794e9..6e03702de 100644
--- a/src/frontend/src/content/docs/dashboard/standalone-for-python.mdx
+++ b/src/frontend/src/content/docs/dashboard/standalone-for-python.mdx
@@ -1,6 +1,6 @@
---
-title: Use the Aspire dashboard with Python apps
-description: How to use the Aspire Dashboard in a Python application.
+title: Aspire dashboard standalone for Python apps
+description: Use the Aspire dashboard standalone with Python applications — configure OpenTelemetry exporters, send OTLP data to the dashboard, and inspect telemetry in real time.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/dashboard/standalone.mdx b/src/frontend/src/content/docs/dashboard/standalone.mdx
index 9861d38d4..e8832d74e 100644
--- a/src/frontend/src/content/docs/dashboard/standalone.mdx
+++ b/src/frontend/src/content/docs/dashboard/standalone.mdx
@@ -1,6 +1,6 @@
---
-title: Standalone Aspire dashboard
-description: How to use the Aspire dashboard standalone.
+title: Run the Aspire dashboard standalone
+description: Run the Aspire dashboard as a standalone container or executable — collect OTLP telemetry from any language, then view logs, traces, and metrics without the AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/de/index.mdx b/src/frontend/src/content/docs/de/index.mdx
index 7b0871904..da9dd1177 100644
--- a/src/frontend/src/content/docs/de/index.mdx
+++ b/src/frontend/src/content/docs/de/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 wurde veröffentlicht! — Was ist neu in Aspire 13.3.
+ 🚀 Aspire 13.4 wurde veröffentlicht! — Was ist neu in Aspire 13.4.
hero:
tagline: Dein Stack, vereinfacht.
Orchestriere Frontends, APIs, Container und Datenbanken mühelos—ohne Umschreiben, ohne Grenzen. Erweitere Aspire, um jedes Projekt anzutreiben.
image:
diff --git a/src/frontend/src/content/docs/deployment/app-lifecycle.mdx b/src/frontend/src/content/docs/deployment/app-lifecycle.mdx
index e6af5307d..ef60cea8d 100644
--- a/src/frontend/src/content/docs/deployment/app-lifecycle.mdx
+++ b/src/frontend/src/content/docs/deployment/app-lifecycle.mdx
@@ -1,9 +1,16 @@
---
title: Example app lifecycle workflow
-description: Follow a worked example that uses GitHub Actions to publish Aspire artifacts and Docker Compose to deploy them later.
+seoTitle: Aspire deployment lifecycle workflow from dev to prod
+description: Follow a worked example that uses GitHub Actions to publish Aspire artifacts and Docker Compose to deploy — a complete deployment lifecycle from commit to production.
---
-import { Aside, FileTree, Steps } from '@astrojs/starlight/components';
+import {
+ Aside,
+ FileTree,
+ Steps,
+ Tabs,
+ TabItem,
+} from '@astrojs/starlight/components';
import LearnMore from '@components/LearnMore.astro';
This guide is a worked example of one CI/CD workflow for Aspire. It uses GitHub Actions to build and publish release artifacts, GitHub Container Registry to store container images, and Docker Compose to run the published output later.
@@ -38,6 +45,9 @@ The following example uses a C# AppHost, but the same workflow shape applies to
Consider [this example](https://github.com/BethMassi/VolumeMount/). You have a distributed application that consists of a Blazor web project that relies on a SQL Server database with a persistent data volume as well as a persistent writable file volume to capture user file uploads.
You want to distribute your Blazor app as a Docker container image via the GitHub Container Registry. You need the [Aspire.Hosting.Docker](/integrations/compute/docker/) and [Aspire.Hosting.SqlServer](/integrations/databases/sql-server/sql-server-get-started/) integrations.
+
+
+
```csharp title="C# — AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
@@ -103,6 +113,74 @@ var blazorweb = builder.AddProject("blazorweb")
builder.Build().Run();
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { ContainerLifetime, createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const compose = await builder.addDockerComposeEnvironment('volumemount-env');
+await compose
+ .withProperties(async (env) => {
+ env.setDashboardEnabled(true);
+ })
+ .configureComposeFile(async (composeFile) => {
+ await composeFile.addVolume('volumemount-blazor-uploads', {
+ driver: 'local',
+ });
+ });
+
+const endpoint = await builder.addParameter('registry-endpoint');
+const repository = await builder.addParameter('registry-repository');
+await builder.addContainerRegistry('container-registry', endpoint, {
+ repository,
+});
+
+const sqlPassword = await builder.addParameter('sqlserver-password', {
+ secret: true,
+});
+const sqlServer = await builder
+ .addSqlServer('sqlserver', { password: sqlPassword })
+ .withDataVolume('volumemount-sqlserver-data')
+ .withLifetime(ContainerLifetime.Persistent);
+
+const sqlDatabase = await sqlServer.addDatabase('sqldb');
+
+const blazorWeb = await builder.addProject(
+ 'blazorweb',
+ '../VolumeMount.BlazorWeb/VolumeMount.BlazorWeb.csproj'
+);
+await blazorWeb
+ .withExternalHttpEndpoints()
+ .withReference(sqlDatabase)
+ .waitFor(sqlDatabase)
+ .publishAsDockerComposeService(async (_resource, service) => {
+ await service.addVolume(
+ 'volumemount-blazor-uploads',
+ '/app/wwwroot/uploads'
+ );
+ await service.user.set('root');
+ await service.command.set([
+ '/bin/sh',
+ '-c',
+ "chown -R app:app /app/wwwroot/uploads && chmod -R 755 /app/wwwroot/uploads && exec su app -c 'dotnet /app/VolumeMount.BlazorWeb.dll'",
+ ]);
+ });
+
+await builder.build().run();
+```
+
+
+
+
+
+
## Phase 1: Develop locally
### Run the app locally
@@ -298,9 +376,8 @@ The `aspire publish` command does the following:
- Outputs artifacts to `./aspire-output/` directory
- - aspire-output/
- - docker-compose.yaml Service definitions for all containers
- - .env Template for required environment variables
+ - aspire-output/ - docker-compose.yaml Service definitions for all containers
+ - .env Template for required environment variables
@@ -363,7 +440,7 @@ After the workflow completes, you have everything needed for production deployme
diff --git a/src/frontend/src/content/docs/deployment/azure/app-service.mdx b/src/frontend/src/content/docs/deployment/azure/app-service.mdx
index 43b63176d..258a1f3df 100644
--- a/src/frontend/src/content/docs/deployment/azure/app-service.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/app-service.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Azure App Service
-description: Learn how to deploy Aspire applications to Azure App Service with the aspire deploy command.
+seoTitle: Deploy Aspire AppHost projects to Azure App Service
+description: "Deploy Aspire applications to Azure App Service with the `aspire deploy` command — plans, containers, configuration, slot deployments, and CI/CD integration."
---
import { Badge, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -56,8 +57,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -122,8 +123,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -196,8 +197,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -245,8 +246,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -280,7 +281,7 @@ builder.AddProject("api")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addProject("api", "../Api/Api.csproj", "https")
.publishAsAzureAppServiceWebsite()
@@ -328,8 +329,8 @@ builder.AddAzureAppServiceEnvironment("app-service-env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -355,8 +356,8 @@ builder.AddAzureAppServiceEnvironment("app-service-env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -388,8 +389,8 @@ builder.AddAzureAppServiceEnvironment("app-service-env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/azure/azure-developer-cli.mdx b/src/frontend/src/content/docs/deployment/azure/azure-developer-cli.mdx
index f613087da..9a271f313 100644
--- a/src/frontend/src/content/docs/deployment/azure/azure-developer-cli.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/azure-developer-cli.mdx
@@ -1,6 +1,7 @@
---
title: Use existing azd workflows
-description: Learn the Aspire-specific compatibility details that still matter when you keep an existing Azure Developer CLI workflow.
+seoTitle: Use Aspire with existing Azure Developer CLI workflows
+description: Learn the Aspire-specific compatibility details that still matter when you keep an existing Azure Developer CLI (azd) workflow — manifest handoff, hooks, and parameters.
next: false
tableOfContents: false
topic: deployment
@@ -48,8 +49,8 @@ builder.AddAzureContainerAppEnvironment("env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/azure/azure-security-best-practices.mdx b/src/frontend/src/content/docs/deployment/azure/azure-security-best-practices.mdx
index 31db78f90..dcf3f31b4 100644
--- a/src/frontend/src/content/docs/deployment/azure/azure-security-best-practices.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/azure-security-best-practices.mdx
@@ -1,7 +1,7 @@
---
-title: Azure security best practices for Aspire deployments
+title: "Aspire on Azure: security best practices"
next: false
-description: Learn how to harden Aspire deployments to Azure with private networking, managed identities, secret management, and monitoring.
+description: Harden Aspire deployments to Azure with private networking, managed identities, secret stores, Key Vault references, and policy guardrails for production workloads.
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
@@ -62,8 +62,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -123,8 +123,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -157,8 +157,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -191,8 +191,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/azure/container-apps.mdx b/src/frontend/src/content/docs/deployment/azure/container-apps.mdx
index 6735fccda..377d8234d 100644
--- a/src/frontend/src/content/docs/deployment/azure/container-apps.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/container-apps.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Azure Container Apps
-description: Learn how to deploy Aspire applications to Azure Container Apps with the aspire deploy command.
+seoTitle: Deploy Aspire apps to Azure Container Apps with azd
+description: "Deploy Aspire applications to Azure Container Apps with the `aspire deploy` command — environments, revisions, scaling, ingress, and secret-backed configuration."
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
@@ -56,8 +57,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -133,8 +134,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -212,8 +213,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -259,8 +260,8 @@ The `ConfigureCustomDomain` API is experimental and may change or be removed in
:::
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -295,7 +296,7 @@ builder.AddProject("api")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const api = await builder.addProject("api", "../Api/Api.csproj", "http");
await api.withExternalHttpEndpoints();
```
@@ -320,8 +321,8 @@ builder.AddAzureContainerAppEnvironment("aspire-env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -350,8 +351,8 @@ builder.AddAzureContainerAppEnvironment("aspire-env")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/azure/index.mdx b/src/frontend/src/content/docs/deployment/azure/index.mdx
index 889132f40..0182a367b 100644
--- a/src/frontend/src/content/docs/deployment/azure/index.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/index.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Azure
-description: Learn how Azure deployment works in Aspire, the shared prerequisites, and how to choose between Azure Container Apps and Azure App Service.
+seoTitle: Deploy Aspire apps to Azure with the Azure Developer CLI
+description: Learn how Azure deployment works in Aspire, the shared prerequisites, and how to choose between Azure App Service, Container Apps, and AKS for production workloads.
---
import { CardGrid, LinkCard, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/deployment/azure/manifest-format.mdx b/src/frontend/src/content/docs/deployment/azure/manifest-format.mdx
index 3372f6c43..766602d45 100644
--- a/src/frontend/src/content/docs/deployment/azure/manifest-format.mdx
+++ b/src/frontend/src/content/docs/deployment/azure/manifest-format.mdx
@@ -1,6 +1,7 @@
---
title: Legacy deployment manifest format
-description: Learn when the legacy Aspire deployment manifest still matters and why most deployments should treat it as an implementation detail.
+seoTitle: Aspire legacy deployment manifest format reference
+description: Learn when the legacy Aspire deployment manifest still matters and why most deployments should treat it as an intermediate artifact for tooling and migration support.
next: false
tableOfContents: false
topic: deployment
diff --git a/src/frontend/src/content/docs/deployment/ci-cd.mdx b/src/frontend/src/content/docs/deployment/ci-cd.mdx
index eb348d1a5..aeb661ca8 100644
--- a/src/frontend/src/content/docs/deployment/ci-cd.mdx
+++ b/src/frontend/src/content/docs/deployment/ci-cd.mdx
@@ -1,6 +1,7 @@
---
title: CI/CD overview
-description: Use the Aspire CLI as the source of truth in CI/CD and design workflows around environments, parameters, and target-specific deployment guidance.
+seoTitle: Aspire CI/CD overview, deployment, and release patterns
+description: Use the Aspire CLI as the source of truth in CI/CD and design workflows around environments, parameters, secrets, container registries, and reproducible deployments.
---
import { CardGrid, LinkCard, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/deployment/custom-deployments.mdx b/src/frontend/src/content/docs/deployment/custom-deployments.mdx
index f9d8ccad8..257478541 100644
--- a/src/frontend/src/content/docs/deployment/custom-deployments.mdx
+++ b/src/frontend/src/content/docs/deployment/custom-deployments.mdx
@@ -1,6 +1,7 @@
---
title: Building custom deployment pipelines
-description: Learn how to build container images from your Aspire resources and create custom deployment pipelines.
+seoTitle: Build custom Aspire deployment pipelines for your apps
+description: Build container images from your Aspire resources and create custom deployment pipelines — extend publishing, target new platforms, and integrate with existing CD tools.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/deployment/deploy-with-aspire.mdx b/src/frontend/src/content/docs/deployment/deploy-with-aspire.mdx
index 44f800d93..dcaaaa643 100644
--- a/src/frontend/src/content/docs/deployment/deploy-with-aspire.mdx
+++ b/src/frontend/src/content/docs/deployment/deploy-with-aspire.mdx
@@ -1,6 +1,6 @@
---
-title: Deploy with Aspire
-description: 'Learn how Aspire deployment works: targets add pipeline steps, commands enter the pipeline, and compute environments, parameters, and environments shape each run.'
+title: How Aspire deployment works
+description: Learn how Aspire deployment works — targets add pipeline steps, commands enter the pipeline, and components compose into a publishable artifact for any environment.
---
import {
@@ -33,8 +33,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -111,8 +111,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/deployment-state-caching.mdx b/src/frontend/src/content/docs/deployment/deployment-state-caching.mdx
index 596535b16..d3dd3f182 100644
--- a/src/frontend/src/content/docs/deployment/deployment-state-caching.mdx
+++ b/src/frontend/src/content/docs/deployment/deployment-state-caching.mdx
@@ -1,6 +1,7 @@
---
title: Deployment state caching
-description: Learn how the aspire deploy command manages deployment state through cached configuration files.
+seoTitle: Aspire deployment state caching across publish runs
+description: "Learn how the `aspire deploy` command manages deployment state through cached configuration files — keys, invalidation, and per-environment override behavior."
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/deployment/docker-compose.mdx b/src/frontend/src/content/docs/deployment/docker-compose.mdx
index 5dda9d57e..053f81ead 100644
--- a/src/frontend/src/content/docs/deployment/docker-compose.mdx
+++ b/src/frontend/src/content/docs/deployment/docker-compose.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Docker Compose
-description: Learn how to publish and deploy your Aspire application using Docker Compose with Docker or Podman.
+seoTitle: Deploy Aspire apps with Docker Compose to any host
+description: Publish and deploy your Aspire application using Docker Compose with Docker or Podman — generate compose files, build images, and orchestrate multi-service production runs.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -72,8 +73,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" {5} twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5} twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -255,9 +256,9 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import type { DockerfileBuilderCallbackContext } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -321,8 +322,8 @@ builder.AddDockerComposeEnvironment("env")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -367,8 +368,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -414,8 +415,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -457,8 +458,8 @@ var apiHost = compose.Resource.GetHostAddressExpression(
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -487,8 +488,8 @@ builder.AddContainer("mycontainer", "myimage:latest")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, ImagePullPolicy } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, ImagePullPolicy } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -538,8 +539,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -617,8 +618,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -671,8 +672,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/environments.mdx b/src/frontend/src/content/docs/deployment/environments.mdx
index 669b62f01..49b6366cb 100644
--- a/src/frontend/src/content/docs/deployment/environments.mdx
+++ b/src/frontend/src/content/docs/deployment/environments.mdx
@@ -1,6 +1,7 @@
---
title: Environments
-description: Learn how to use Aspire environments to configure your application for development, staging, and production deployments.
+seoTitle: Aspire deployment environments and target configuration
+description: Use Aspire environments to configure your application for development, staging, and production — parameters, secrets, container tags, and per-environment overrides.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -87,8 +88,8 @@ if (builder.Environment.IsEnvironment("Testing"))
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const env = await builder.environment.get();
@@ -150,8 +151,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const env = await builder.environment.get();
@@ -223,8 +224,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -321,8 +322,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const isRunMode = await builder.executionContext.isRunMode();
diff --git a/src/frontend/src/content/docs/deployment/index.mdx b/src/frontend/src/content/docs/deployment/index.mdx
index b1ec0c595..4d2fc28ea 100644
--- a/src/frontend/src/content/docs/deployment/index.mdx
+++ b/src/frontend/src/content/docs/deployment/index.mdx
@@ -1,12 +1,12 @@
---
-title: Aspire Deployment
+title: Aspire deployment overview
prev:
link: /dashboard/
label: Dashboard
next:
link: /reference/overview/
label: Reference
-description: Ship your Aspire applications to Azure, Docker, Kubernetes, and beyond — with confidence and consistency.
+description: Ship your Aspire applications to Azure, Docker, Kubernetes, and beyond — choose a target, publish artifacts, and deploy with the Aspire CLI from a single AppHost.
editUrl: false
tableOfContents: false
pageActions: false
diff --git a/src/frontend/src/content/docs/deployment/javascript-apps.mdx b/src/frontend/src/content/docs/deployment/javascript-apps.mdx
index 75685c5bf..f70537e80 100644
--- a/src/frontend/src/content/docs/deployment/javascript-apps.mdx
+++ b/src/frontend/src/content/docs/deployment/javascript-apps.mdx
@@ -1,6 +1,7 @@
---
title: Deploy JavaScript apps
-description: Learn the main production deployment models for JavaScript app resources in Aspire.
+seoTitle: Deploy Aspire JavaScript apps with the Aspire AppHost
+description: Learn the main production deployment models for JavaScript app resources in Aspire — Next.js, Vite, SSR frameworks, container images, and CDN-fronted hosting targets.
---
import { Aside, TabItem, Tabs } from '@astrojs/starlight/components';
@@ -82,8 +83,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -165,8 +166,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -222,7 +223,7 @@ if (builder.ExecutionContext.IsRunMode)
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const frontend = await builder.addViteApp('frontend', './frontend');
const gateway = await builder
@@ -301,8 +302,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -394,8 +395,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -457,8 +458,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -519,8 +520,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -600,8 +601,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -656,8 +657,8 @@ builder.Build().Run();
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -724,7 +725,7 @@ The following table summarizes common framework outputs and the Aspire patterns
| Nuxt | `PublishAsNpmScript` | `node .output/server/index.mjs` (via `start`) | `NUXT_` prefix on `runtimeConfig` env vars |
| Astro SSR | `PublishAsNpmScript` | `node ./dist/server/entry.mjs` (via `start`) | `@astrojs/node`, `prerender: false` per page |
| Remix / React Router | `PublishAsNpmScript` | `react-router-serve` (via `start`) | None |
-| Qwik City | `PublishAsNpmScript` | `node server/entry.node-server.js` (via `start`) | Node server adapter, Node 20+ |
+| Qwik City | `PublishAsNpmScript` | `node server/entry.node-server.js` (via `start`) | Node server adapter, Node 22.x or 24.x LTS |
For per-framework AppHost snippets, see [JavaScript integration — Framework
@@ -739,8 +740,8 @@ The SSR examples below assume the AppHost captures the backend endpoint with `ap
The AppHost snippets in this section assume this shared setup:
-```typescript title="AppHost — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="AppHost — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -760,7 +761,7 @@ const apiEndpoint = await api.getEndpoint('http');
- **Server API routes**: The recommended pattern for calling external APIs from Nuxt is a [server API route](https://nuxt.com/docs/guide/directory-structure/server) (`server/api/.ts`) that uses `useRuntimeConfig()`, consumed from a page via [`useAsyncData`](https://nuxt.com/docs/api/composables/use-async-data).
- **Publish method**: Always use `PublishAsNpmScript` for Nuxt. The Nitro `.output/` looks self-contained, but server-side data fetching via `useAsyncData` / `useFetch` fails without the full `node_modules` available at runtime.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('nuxt', './frameworks/nuxt', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -800,7 +801,7 @@ export default defineEventHandler(async () => {
- **Environment variables**: Use `process.env.API_URL`, not `import.meta.env.API_URL`. `import.meta.env` values are resolved at build time and baked into the output.
- **Runtime dependencies**: The built `entry.mjs` imports unbundled `@astrojs/*` packages, so SSR Astro must use `PublishAsNpmScript`. The [official Docker recipe](https://docs.astro.build/en/recipes/docker/#multi-stage-build-using-ssr) confirms `node_modules` must be copied into the runtime image.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('astro-ssr', './frameworks/astro-ssr', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -843,7 +844,7 @@ const weather = response.ok ? await response.json() : [];
- **Server-side data**: Use a [`+page.server.ts`](https://svelte.dev/docs/kit/load) `load` function for server-side fetching. `process.env.API_URL` is available inside the load function.
- **Output shape**: The `build/` directory is fully self-contained, so no `node_modules` are required at runtime. This makes SvelteKit a good fit for `PublishAsNodeServer`.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('sveltekit', './frameworks/sveltekit', { runScriptName: 'dev' })
.publishAsNodeServer('build/index.js', { outputPath: 'build' })
@@ -888,7 +889,7 @@ export const load: PageServerLoad = async ({ fetch }) => {
- **Copy shape**: The standalone build produces three directories that must be copied separately into the runtime image: `.next/standalone/` (server + bundled deps), `.next/static/` (client assets), and `public/` (static files). `AddNextJsApp` handles this automatically; see the [official with-docker example](https://github.com/vercel/next.js/tree/canary/examples/with-docker) if you need to do it manually.
- **Server components**: Default App Router components are [server components](https://nextjs.org/docs/app/getting-started/server-and-client-components). Use `async` directly in the component body to fetch data; no special loader pattern is needed.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addNextJsApp('nextjs', './frameworks/nextjs', { runScriptName: 'dev' })
.withEnvironment('API_URL', apiEndpoint)
@@ -928,7 +929,7 @@ export default async function Home() {
- **Server functions**: Use [`createServerFn`](https://tanstack.com/start/latest/docs/framework/react/server-functions) for server-side data loading from route loaders.
- **Environment variables**: `process.env.API_URL` is available inside server functions at runtime.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('tanstack-start', './frameworks/tanstack-start', {
runScriptName: 'dev',
@@ -964,7 +965,7 @@ export const Route = createFileRoute('/')({
- **Server binary**: `react-router-serve` lives in `node_modules`; it's not bundled into the build output. This is why Remix needs `PublishAsNpmScript` rather than `PublishAsNodeServer`. See the [React Router deployment guide](https://reactrouter.com/start/framework/deploying) and the [`node-custom-server` template](https://github.com/remix-run/react-router-templates/tree/main/node-custom-server) for production server patterns.
- **Port binding**: Pass `-- --port "$PORT"` as `runScriptArguments` so the server listens on Aspire's assigned port.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('remix', './frameworks/remix', { runScriptName: 'dev' })
.publishAsNpmScript({
@@ -1003,12 +1004,12 @@ export async function loader() {
#### Qwik City
-- **Node version**: Qwik uses Vite 7, which requires Node 20+. Set `engines.node` in `package.json` accordingly.
+- **Node version**: Qwik uses Vite 7. Set `engines.node` in `package.json` to a supported Node.js LTS release: 22.x or 24.x.
- **Server adapter**: Requires the [Qwik Node adapter](https://qwik.dev/docs/deployments/node/). Add `adaptors/node-server/vite.config.ts` with `nodeServerAdapter()` and a corresponding `src/entry.node-server.tsx`.
- **Build steps**: Requires both `npm run build.client` and `npm run build.server`. The default `npm run build` runs both via `qwik build`.
- **SSR data loading**: Use [`routeLoader$`](https://qwik.dev/docs/route-loader/) for server-side data loading. Read the backend URL via `process.env['API_URL']`.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('qwik', './frameworks/qwik', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -1019,7 +1020,7 @@ await builder
```json title="Qwik City — package.json"
{
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": "^22.13.0 || ^24.0.0"
},
"scripts": {
"build": "qwik build",
@@ -1068,7 +1069,7 @@ export const useWeatherData = routeLoader$(async () => {
- **Dev proxy**: Angular doesn't expose `vite.config.ts`. Use a [`proxy.conf.js`](https://angular.dev/tools/cli/serve) (not `.json`) that reads `process.env.API_HTTP`, referenced from `angular.json` under `serve.options.proxyConfig`.
- **Output path**: Set [`outputPath`](https://angular.dev/reference/configs/workspace-config) in `angular.json` to `{ "base": "dist", "browser": "" }` so the production build writes directly to `dist/` for `PublishAsStaticWebsite`.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('angular', './frameworks/angular', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -1123,7 +1124,7 @@ module.exports = {
- **API calls**: Use the `apiPath` / `apiTarget` options on `PublishAsStaticWebsite` so the backend is reachable through YARP. Don't use `VITE_*` env vars for runtime API URLs; they're baked at build time.
- **Dev proxy**: Add [`server.proxy`](https://vite.dev/config/server-options.html#server-proxy) in `vite.config.ts` reading `process.env.API_HTTP` to forward `/api/*` to the backend in dev mode.
-```typescript title="AppHost — apphost.ts"
+```typescript title="AppHost — apphost.mts"
await builder
.addViteApp('react', './frameworks/react', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -1201,8 +1202,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1220,6 +1221,49 @@ The `DisableBuildOnlyContainerValidation` method is marked experimental with the
`AddNextJsApp` is different because it represents the Next.js standalone-server publish model directly. Use it when the app is a Next.js app with `output: "standalone"` rather than modeling the app with `AddJavaScriptApp` and choosing a generic npm-script publish method.
+### Run script and existing Dockerfile conflict
+
+When `AddJavaScriptApp` finds an existing user-authored `Dockerfile` in the app directory, Aspire uses that Dockerfile as the publish container image and cannot safely replace its `ENTRYPOINT`. If you also pass an explicit `runScriptName` to `AddJavaScriptApp` or call `.WithRunScript(...)` with a non-default script name, Aspire fails at publish time with a clear error rather than silently emitting an image that ignores the requested script:
+
+```text
+JavaScript app resource 'js' is configured to run script 'migrate', but publish is using the existing Dockerfile 'Dockerfile'. An existing Dockerfile entrypoint cannot be changed automatically from runScriptName or WithRunScript. Remove or rename the Dockerfile so Aspire can generate one, or call PublishAsDockerFile(...) and set the container entrypoint explicitly.
+```
+
+To resolve the conflict, choose one of the following options:
+
+- **Remove or rename the Dockerfile** so Aspire generates a new one that runs your requested script as the container entrypoint.
+- **Override the container entrypoint explicitly** by calling `PublishAsDockerFile(...)` and configuring the entrypoint directly on the container resource. This keeps the existing Dockerfile and gives you full control over what runs:
+
+
+
+
+```csharp title="AppHost.cs"
+builder
+ .AddJavaScriptApp("js", "./js", runScriptName: "migrate")
+ .WithBun()
+ .PublishAsDockerFile(container => container
+ .WithEntrypoint("bun")
+ .WithArgs("src/migrate.ts"));
+```
+
+
+
+
+```typescript title="apphost.mts"
+await builder
+ .addJavaScriptApp('js', './js', { runScriptName: 'migrate' })
+ .withBun()
+ .publishAsDockerFile(async container => {
+ container.withEntrypoint('bun');
+ container.withArgs(['src/migrate.ts']);
+ });
+```
+
+
+
+
+Using the implicit default `runScriptName` (`"dev"`) without any custom arguments is always allowed, even when an existing Dockerfile is present, because no script override is actually requested in that case.
+
## Common mistakes
- Expecting `AddViteApp` or `AddJavaScriptApp` to be the deployed production web server without choosing a publish method.
@@ -1230,6 +1274,7 @@ The `DisableBuildOnlyContainerValidation` method is marked experimental with the
- Calling `.WithHttpEndpoint()` on `AddViteApp`.
- Using `VITE_*` variables for values that must be resolved at runtime in an already-built SPA.
- Adding a Vite or JavaScript app without choosing a production serving model, which causes a publish/deploy validation error for an unconsumed build-only container.
+- Passing an explicit `runScriptName` or calling `.WithRunScript(...)` when the app directory already has a user-authored Dockerfile, which causes a publish-time conflict error. Remove the Dockerfile or use `PublishAsDockerFile(...)` with an explicit container entrypoint to resolve the conflict.
For runtime configuration guidance, see [JavaScript
diff --git a/src/frontend/src/content/docs/deployment/kubernetes-gateway-aks.mdx b/src/frontend/src/content/docs/deployment/kubernetes-gateway-aks.mdx
index 367835c19..32308ee91 100644
--- a/src/frontend/src/content/docs/deployment/kubernetes-gateway-aks.mdx
+++ b/src/frontend/src/content/docs/deployment/kubernetes-gateway-aks.mdx
@@ -1,6 +1,7 @@
---
title: Configure Gateway API on AKS
-description: Learn how to expose .NET Aspire services on AKS using Kubernetes Gateway API with Application Gateway for Containers (AGC) and automatic TLS via HTTP-01.
+seoTitle: Configure Gateway API on AKS for Aspire deployments
+description: Expose .NET Aspire services on AKS using Kubernetes Gateway API with Application Gateway for Containers — routing, TLS, and per-resource gateway annotations.
sidebar:
badge:
text: Preview
@@ -19,6 +20,10 @@ Gateway API with HTTP-01 is the **recommended approach** for TLS on AKS because:
- **No Azure DNS zone or managed identity needed** — significantly simpler infrastructure than DNS-01.
- **Works with any domain** — including the auto-assigned AGC FQDN (`*.alb.azure.com`), your own custom domain, or even without a pre-existing DNS zone.
+
+
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const hostname = builder.addParameter('hostname');
const ingressClass = builder.addParameter('ingressclass');
diff --git a/src/frontend/src/content/docs/deployment/kubernetes.mdx b/src/frontend/src/content/docs/deployment/kubernetes.mdx
index f8d45ef29..f06374cee 100644
--- a/src/frontend/src/content/docs/deployment/kubernetes.mdx
+++ b/src/frontend/src/content/docs/deployment/kubernetes.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Kubernetes
-description: Learn how to publish and deploy your Aspire application to Kubernetes using Helm charts.
+seoTitle: Deploy Aspire apps to Kubernetes clusters with Helm
+description: Publish and deploy your Aspire application to Kubernetes using Helm charts — generated manifests, configurable values, secrets, and multi-environment release strategies.
sidebar:
badge: Preview
---
@@ -36,8 +37,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" {5} twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5} twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -173,8 +174,8 @@ builder.AddKubernetesEnvironment("k8s")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -225,8 +226,8 @@ builder.AddContainer("service", "nginx")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/deployment/kubernetes/aks.mdx b/src/frontend/src/content/docs/deployment/kubernetes/aks.mdx
index 4249a1223..92043191b 100644
--- a/src/frontend/src/content/docs/deployment/kubernetes/aks.mdx
+++ b/src/frontend/src/content/docs/deployment/kubernetes/aks.mdx
@@ -1,10 +1,12 @@
---
title: Deploy to Azure Kubernetes Service (AKS)
-description: Learn how to deploy your Aspire application to Azure Kubernetes Service with full provisioning of AKS, ACR, and Azure resources.
+seoTitle: Deploy Aspire apps to Azure Kubernetes Service (AKS)
+description: Deploy your Aspire application to Azure Kubernetes Service with full provisioning of AKS clusters, container registries, ingress, identity, and observability.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
import LearnMore from '@components/LearnMore.astro';
+import OsAwareTabs from '@components/OsAwareTabs.astro';
Deploy your Aspire application to Azure Kubernetes Service (AKS). Aspire provisions the AKS cluster, Azure Container Registry (ACR), and any Azure resources your app depends on — then deploys your application in a single command.
@@ -52,8 +54,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" {5}
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5}
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -96,7 +98,7 @@ builder.AddAzureKubernetesEnvironment("aks")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const aks = await builder.addAzureKubernetesEnvironment('aks');
await aks.withSystemNodePool('Standard_D4s_v5', 1, 5);
```
@@ -118,7 +120,7 @@ builder.AddContainer("ml-worker", "my-ml-image")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const aks = await builder.addAzureKubernetesEnvironment('aks');
const gpuPool = await aks.addNodePool('gpupool', 'Standard_NC6s_v3', 0, 5);
@@ -154,6 +156,346 @@ Aspire performs the following steps:
The first deployment may take several minutes while the AKS cluster and ACR are provisioned. Subsequent deployments are faster as Aspire reuses existing infrastructure.
:::
+## Expose your app to the internet
+
+By default, the services Aspire deploys to AKS are reachable only from inside the cluster. To accept traffic from the public internet — for example a web frontend or a public API — you add an **Application Gateway for Containers (AGC)** load balancer and a **Gateway API** `Gateway` to your AppHost, then opt into automatic HTTPS with **cert-manager**. Everything in this section is provisioned by `aspire deploy` alongside the rest of your infrastructure; you don't run any `az aks`, `az network alb`, or `helm install` commands by hand.
+
+
+This walkthrough uses the integrated AGC + cert-manager APIs that ship with [📦 Aspire.Hosting.Azure.Kubernetes](https://www.nuget.org/packages/Aspire.Hosting.Azure.Kubernetes) and require no additional package. If you have a pre-existing AKS cluster that wasn't provisioned by Aspire, see the bring-your-own-cluster walkthroughs for [Gateway API on AKS](/deployment/kubernetes-gateway-aks/) and [Ingress on AKS](/deployment/kubernetes-ingress-aks/) instead.
+
+
+### How AGC ingress fits together
+
+When you opt in via `AddLoadBalancer`, Aspire flips the AKS cluster's Bicep to enable the AKS-managed Gateway API and Application Load Balancer ingress profiles. After deploy, the cluster runs the Microsoft-managed AGC controller, which watches for Aspire's generated `Gateway` and `HTTPRoute` resources and programs an Azure-hosted HTTPS frontend automatically.
+
+The pieces fit together like this:
+
+| Aspire AppHost call | What it produces in Azure / Kubernetes |
+|---|---|
+| `AddAzureKubernetesEnvironment` | AKS cluster (with Gateway API + ALB ingress profile when an LB is added) and ACR |
+| `AddAzureVirtualNetwork` + `AddSubnet` | A VNet and subnets — one for AKS nodes, one (or more) delegated to AGC |
+| `AddLoadBalancer(name, subnet)` | An AGC `ApplicationLoadBalancer` CR plus role assignments on the subnet |
+| `AddGateway(name).WithLoadBalancer(lb)` | A Gateway API `Gateway` resource attached to the AGC frontend |
+| `WithRoute(path, endpoint)` | An `HTTPRoute` that points the path at your service |
+| `AddCertManager(name).AddIssuer(...)` | cert-manager Helm release plus a `ClusterIssuer` |
+| `WithTls(issuer)` | An HTTPS listener and a cert-manager-issued certificate per gateway hostname |
+
+### Prerequisites for AGC
+
+Application Gateway for Containers ingress on AKS uses preview Azure features that need to be registered once per subscription. Run these commands and wait for both feature registrations to report `Registered`:
+
+
+
+
+
+
+
+### Add a virtual network and subnets
+
+AGC requires a dedicated subnet for its frontend that is delegated to `Microsoft.ServiceNetworking/trafficControllers`. The AKS node subnet and the AGC subnet must not overlap, and the AKS service CIDR defaults to `10.0.0.0/16` — pick a VNet range that avoids it.
+
+
+
+```csharp title="AppHost.cs"
+#pragma warning disable ASPIREAZURE003 // AddSubnet is evaluation-only
+
+var vnet = builder.AddAzureVirtualNetwork("vnet", "10.100.0.0/16");
+var aksSubnet = vnet.AddSubnet("aks-nodes", "10.100.0.0/22");
+var albSubnet = vnet.AddSubnet("alb-public", "10.100.4.0/24");
+
+var aks = builder.AddAzureKubernetesEnvironment("aks")
+ .WithSubnet(aksSubnet);
+```
+
+
+```typescript title="apphost.mts"
+const vnet = await builder.addAzureVirtualNetwork('vnet', '10.100.0.0/16');
+const aksSubnet = await vnet.addSubnet('aks-nodes', '10.100.0.0/22');
+const albSubnet = await vnet.addSubnet('alb-public', '10.100.4.0/24');
+
+const aks = await builder.addAzureKubernetesEnvironment('aks');
+await aks.withSubnet(aksSubnet);
+```
+
+
+
+
+
+### Add an Application Gateway for Containers load balancer
+
+`AddLoadBalancer` returns a typed handle that gateways and ingresses attach to. Behind the scenes it delegates the supplied subnet to AGC, grants the controller's managed identity `Network Contributor` on the subnet, and applies the `ApplicationLoadBalancer` custom resource once the `azure-alb-external` GatewayClass is ready in the cluster.
+
+
+
+```csharp title="AppHost.cs"
+var publicLb = aks.AddLoadBalancer("public", albSubnet);
+```
+
+
+```typescript title="apphost.mts"
+const publicLb = await aks.addLoadBalancer('public', albSubnet);
+```
+
+
+
+
+
+### Add a Gateway with a route to your service
+
+`AddGateway` declares a Kubernetes Gateway API `Gateway`. `WithLoadBalancer` attaches it to the AGC ALB you just created and defaults the `gatewayClassName` to `azure-alb-external`. `WithRoute` adds an `HTTPRoute` that forwards a path to the named endpoint on one of your services.
+
+
+
+```csharp title="AppHost.cs"
+var api = builder.AddProject("api")
+ .WithExternalHttpEndpoints();
+
+aks.AddGateway("storefront")
+ .WithLoadBalancer(publicLb)
+ .WithRoute("/", api.GetEndpoint("http"));
+```
+
+
+```typescript title="apphost.mts"
+const api = await builder
+ .addNodeApp('api', './api', 'src/index.ts')
+ .withHttpEndpoint({ env: 'PORT' })
+ .withExternalHttpEndpoints();
+
+const storefront = await aks.addGateway('storefront');
+await storefront.withLoadBalancer(publicLb);
+await storefront.withRoute('/', api.getEndpoint('http'));
+```
+
+
+
+Use the host overload of `WithRoute` when you need to send different hostnames to different backends — for example `WithRoute("api.contoso.com", "/", api.GetEndpoint("http"))`.
+
+### First deploy: HTTP on the AGC FQDN
+
+Run `aspire deploy`. After it finishes, AGC assigns the gateway a frontend FQDN of the form `.fz.alb.azure.com`. Read it from the deployed `Gateway` and curl your service to confirm the load balancer and route are wired up before adding TLS:
+
+```bash title="Read the AGC FQDN and curl the gateway"
+kubectl get gateway storefront -o jsonpath='{.status.addresses[0].value}'
+curl http:///
+```
+
+
+
+### Add automatic HTTPS with cert-manager
+
+`AddCertManager` installs the upstream cert-manager Helm chart with the CRDs and Gateway API watcher enabled and the `--force-conflicts` flag set so AKS's Azure Policy add-on doesn't break subsequent upgrades. `AddIssuer` adds a typed `ClusterIssuer` parented to that installation, and `WithTls(issuer)` on a gateway adds an HTTPS listener that cert-manager will populate with a real certificate.
+
+
+
+```csharp title="AppHost.cs"
+var certManager = aks.AddCertManager("cert-manager");
+
+var letsencrypt = certManager.AddIssuer("letsencrypt-prod")
+ .WithLetsEncryptProduction("ops@contoso.com")
+ .WithHttp01Solver();
+
+aks.AddGateway("storefront")
+ .WithLoadBalancer(publicLb)
+ .WithRoute("/", api.GetEndpoint("http"))
+ .WithTls(letsencrypt);
+```
+
+
+```typescript title="apphost.mts"
+const certManager = await aks.addCertManager('cert-manager');
+
+const letsencrypt = await certManager.addIssuer('letsencrypt-prod');
+await letsencrypt.withLetsEncryptProduction('ops@contoso.com');
+await letsencrypt.withHttp01Solver();
+
+const storefront = await aks.addGateway('storefront');
+await storefront.withLoadBalancer(publicLb);
+await storefront.withRoute('/', api.getEndpoint('http'));
+await storefront.withTls(letsencrypt);
+```
+
+
+
+`WithTls(issuer)` is the strongly-typed overload — it validates at AppHost-build time that the gateway and the issuer's cert-manager installation belong to the same Kubernetes environment. There is also a no-argument `WithTls()` (auto-generated secret name, no issuer annotation) and a `WithTls(secretName)` overload for cases where you manage the certificate yourself.
+
+Calling `WithTls` flips the gateway to an HTTPS-first posture:
+
+- A `301 Moved Permanently` redirect is added to the HTTP listener so requests on port 80 are upgraded to `https://` automatically. The cert-manager HTTP-01 solver registers an exact-match route for `/.well-known/acme-challenge/` and wins over the redirect's `/` prefix, so ACME continues to work.
+- A `Strict-Transport-Security: max-age=31536000` response header is emitted on HTTPS responses so returning browsers refuse plain HTTP for a year.
+
+To tune or disable these defaults, pass an options callback. The `includeSubDomains` and `preload` HSTS flags are off by default because they're hard to reverse once browsers cache them — opt in explicitly when you're ready to commit to the hostname:
+
+
+
+```csharp title="AppHost.cs"
+aks.AddGateway("storefront")
+ .WithLoadBalancer(publicLb)
+ .WithRoute("/", api.GetEndpoint("http"))
+ .WithTls(letsencrypt, options =>
+ {
+ options.Hsts.IncludeSubDomains = true;
+ options.Hsts.Preload = true;
+ });
+```
+
+
+```typescript title="apphost.mts"
+await storefront.withTls(letsencrypt, {
+ hsts: { includeSubDomains: true, preload: true },
+});
+```
+
+
+
+
+
+#### How the certificate gets issued
+
+cert-manager validates domain ownership using the **HTTP-01** challenge configured by `WithHttp01Solver` — it asks the gateway to serve a token at `/.well-known/acme-challenge/` and verifies the response. There is no DNS API access required, so this works for the auto-assigned `*.alb.azure.com` FQDN out of the box.
+
+To break the chicken-and-egg problem where AGC won't program a Gateway whose HTTPS listener references a missing secret, Aspire pre-creates a self-signed bootstrap secret on the first deploy. Once AGC publishes the gateway's FQDN, Aspire patches the listener with the real hostname and cert-manager swaps the bootstrap certificate for a Let's Encrypt one. You may briefly see a self-signed certificate during the first deploy — this is expected.
+
+### Verify the certificate
+
+After the deploy completes, watch the `Certificate` resource transition to `Ready=True`:
+
+```bash title="Inspect the cert-manager Certificate"
+kubectl get certificate
+kubectl describe certificate storefront-tls
+```
+
+Confirm port 80 is now redirecting to HTTPS:
+
+```bash title="Verify the HTTP→HTTPS redirect"
+curl -i http:///
+# HTTP/1.1 301 Moved Permanently
+# Location: https:///
+```
+
+Then curl the gateway over HTTPS and confirm the certificate chain comes from Let's Encrypt and the `Strict-Transport-Security` header is present:
+
+```bash title="Verify TLS and HSTS"
+curl -sIv https:/// 2>&1 | grep -iE "issuer:|strict-transport-security:"
+# * issuer: C=US; O=Let's Encrypt; CN=R10
+# strict-transport-security: max-age=31536000
+```
+
+## Use a custom domain
+
+The `*.alb.azure.com` FQDN is fine for testing but real applications need a hostname customers can remember. Adding a custom domain is a small change to the AppHost plus a DNS record at your registrar.
+
+### Tell the gateway about your hostname
+
+`WithHostname` adds the hostname to the gateway's `HTTPRoute`s and to the HTTPS listener so cert-manager issues the certificate for the right name. Use the parameter overload when the hostname differs across deployment environments.
+
+
+
+```csharp title="AppHost.cs"
+var hostname = builder.AddParameter("hostname"); // e.g. "api.contoso.com"
+
+aks.AddGateway("storefront")
+ .WithLoadBalancer(publicLb)
+ .WithHostname(hostname)
+ .WithRoute("/", api.GetEndpoint("http"))
+ .WithTls(letsencrypt);
+```
+
+
+```typescript title="apphost.mts"
+const hostname = builder.addParameter('hostname'); // e.g. "api.contoso.com"
+
+const storefront = await aks.addGateway('storefront');
+await storefront.withLoadBalancer(publicLb);
+await storefront.withHostname(hostname);
+await storefront.withRoute('/', api.getEndpoint('http'));
+await storefront.withTls(letsencrypt);
+```
+
+
+
+Provide the hostname value at deploy time:
+
+```bash title="Deploy with the hostname parameter"
+aspire deploy --parameter hostname=api.contoso.com
+```
+
+### Point your DNS at the AGC frontend
+
+Read the AGC FQDN from the deployed gateway, then create a `CNAME` record at your DNS provider that points your custom hostname at it. The DNS provider doesn't matter — Azure DNS, Cloudflare, Route 53, GoDaddy, anything that supports `CNAME` records will work.
+
+```bash title="Get the AGC FQDN to CNAME against"
+kubectl get gateway storefront -o jsonpath='{.status.addresses[0].value}'
+# 8a3...cd.fz12.alb.azure.com
+```
+
+```text title="Example DNS record"
+api.contoso.com. CNAME 8a3...cd.fz12.alb.azure.com.
+```
+
+
+
+### Re-deploy and verify
+
+Re-running `aspire deploy` is idempotent. Once your DNS record propagates, cert-manager's HTTP-01 challenge will succeed against the new hostname and a fresh certificate is issued automatically:
+
+```bash title="Verify the custom domain"
+curl -v https://api.contoso.com/ 2>&1 | grep -i "issuer:\|subject:"
+```
+
+
+
## Publish AKS artifacts
To generate deployment artifacts without deploying, use `aspire publish`:
@@ -202,7 +544,7 @@ builder.AddProject("api")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const api = await builder
.addNodeApp('api', './api', 'src/index.ts')
.withHttpEndpoint({ env: 'PORT' });
@@ -232,11 +574,79 @@ If pods fail with `ImagePullBackOff`, verify that the AKS cluster has the correc
az aks check-acr --resource-group --name --acr .azurecr.io
```
+### Certificate stays `Ready=False`
+
+If `kubectl get certificate` reports the certificate as not ready for more than a few minutes, describe it and the cert-manager `Order`/`Challenge` resources to see what failed:
+
+```bash title="Diagnose a stuck certificate"
+kubectl describe certificate storefront-tls
+kubectl describe challenge -A
+```
+
+Common causes:
+
+- **DNS hasn't propagated yet** when using a custom domain — Let's Encrypt fetches `http:///.well-known/acme-challenge/...` and that has to resolve to the AGC frontend.
+- **HTTP traffic is blocked** between Let's Encrypt and the gateway — HTTP-01 needs port 80 open. AGC keeps the HTTP listener that `AddGateway` generates open by default; don't remove it.
+- **Production rate limit hit** while iterating — switch the issuer to `WithLetsEncryptStaging` until everything else works, then flip back to production.
+- **The contact email was rejected by ACME** — see [Let's Encrypt rejects the contact email](#lets-encrypt-rejects-the-contact-email).
+- **The bootstrap TLS secret is missing** — see [Gateway HTTPS listener reports `InvalidCertificateRef`](#gateway-https-listener-reports-invalidcertificateref).
+
+### Let's Encrypt rejects the contact email
+
+The first time you `aspire deploy` with `WithLetsEncryptProduction(email)` or `WithLetsEncryptStaging(email)`, cert-manager creates an ACME account using that email. Let's Encrypt validates the address and refuses to register accounts whose email uses a reserved or forbidden domain. The `ClusterIssuer` will report `Ready=False` and `kubectl describe clusterissuer ` will show one of:
+
+- `Domain name does not end with a valid public suffix` — the TLD isn't a registered public suffix. Reserved TLDs from RFC 2606 (`.test`, `.example`, `.invalid`, `.localhost`) are common offenders.
+- `contact email has forbidden domain example.com` — Let's Encrypt explicitly blocks the IANA example domains (`example.com`, `example.net`, `example.org`).
+
+Use a real address on a registered public domain (your corporate domain, or a personal mailbox like `you@gmail.com`). The address must be syntactically valid, but Let's Encrypt does not send mail to it during provisioning — it's the contact for expiry warnings.
+
+### Gateway HTTPS listener reports `InvalidCertificateRef`
+
+If `kubectl describe gateway storefront` shows `Secret default/storefront-tls does not exist` on the HTTPS listener, AGC will refuse to program the HTTPS frontend and any in-flight cert-manager `Challenge` will stall because its solver `HTTPRoute` can't be attached. This typically happens if you delete the `storefront-tls` secret manually to "force a reissue" — the bootstrap self-signed secret Aspire pre-creates is also wiped, breaking the chicken-and-egg pattern described in [How the certificate gets issued](#how-the-certificate-gets-issued).
+
+Recover by recreating a placeholder secret so AGC can program the listener again — cert-manager will overwrite it with a real certificate within a minute:
+
+```bash title="Restore the bootstrap secret"
+TMPDIR=$(mktemp -d)
+openssl req -x509 -newkey rsa:2048 -nodes -days 1 \
+ -keyout "$TMPDIR/key.pem" -out "$TMPDIR/cert.pem" \
+ -subj "/CN=bootstrap.invalid"
+kubectl create secret tls storefront-tls \
+ --cert="$TMPDIR/cert.pem" --key="$TMPDIR/key.pem" -n default
+rm -rf "$TMPDIR"
+```
+
+To force a legitimate reissue without removing the secret, annotate the `Certificate` instead:
+
+```bash title="Force cert-manager to reissue"
+kubectl cert-manager renew storefront-tls
+```
+
+### Gateway never gets an FQDN
+
+If `kubectl get gateway` shows no address after `aspire deploy` succeeds, check that the AGC ingress profile actually came up on the cluster:
+
+```bash title="Check the AGC controller and GatewayClass"
+kubectl get gatewayclass azure-alb-external
+kubectl get pods -n kube-system -l app=alb-controller
+```
+
+If the `azure-alb-external` GatewayClass doesn't exist, the most common cause is that the `ManagedGatewayAPIPreview` and `ApplicationLoadBalancerPreview` features aren't registered on the subscription — re-run the `az feature register` commands from [Prerequisites for AGC](#prerequisites-for-agc), then `aspire deploy` again.
+
+### `helm upgrade` fails on cert-manager SSA conflicts
+
+`AddCertManager` already passes `--force-conflicts` to `helm upgrade` to handle the field-manager conflict that AKS's Azure Policy add-on creates against cert-manager's `ValidatingWebhookConfiguration`. If you install cert-manager yourself with raw `AddHelmChart` instead, add `.WithForceConflicts()` to the chart resource, otherwise the second deploy will fail with a server-side-apply conflict on `.webhooks[*].namespaceSelector`.
+
## See also
- [AKS integration](/integrations/cloud/azure/aks/)
- [Kubernetes integration](/integrations/compute/kubernetes/)
- [Deploy to Kubernetes](/deployment/kubernetes/)
+- [Expose services with Ingress and Gateway API](/deployment/kubernetes-ingress/)
+- [Gateway API on AKS (bring-your-own cluster)](/deployment/kubernetes-gateway-aks/)
+- [Ingress on AKS (bring-your-own cluster)](/deployment/kubernetes-ingress-aks/)
- [Deploy to Azure](/deployment/azure/)
- [Pipelines and app topology](/deployment/pipelines/)
- [Azure Kubernetes Service documentation](https://learn.microsoft.com/azure/aks/)
+- [Application Gateway for Containers documentation](https://learn.microsoft.com/azure/application-gateway/for-containers/)
+- [cert-manager documentation](https://cert-manager.io/)
diff --git a/src/frontend/src/content/docs/deployment/kubernetes/index.mdx b/src/frontend/src/content/docs/deployment/kubernetes/index.mdx
index 87c29e251..70bb541e9 100644
--- a/src/frontend/src/content/docs/deployment/kubernetes/index.mdx
+++ b/src/frontend/src/content/docs/deployment/kubernetes/index.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Kubernetes
-description: Learn how to deploy Aspire applications to Kubernetes — whether you manage your own cluster or use Azure Kubernetes Service (AKS).
+seoTitle: 'Aspire on Kubernetes overview: target a real cluster'
+description: Deploy Aspire applications to Kubernetes — whether you manage your own cluster or use Azure Kubernetes Service, Helm-based publishing, and CI/CD integrations.
---
import { CardGrid, LinkCard, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/deployment/kubernetes/kubernetes.mdx b/src/frontend/src/content/docs/deployment/kubernetes/kubernetes.mdx
index 0ae35f046..a9e4886bf 100644
--- a/src/frontend/src/content/docs/deployment/kubernetes/kubernetes.mdx
+++ b/src/frontend/src/content/docs/deployment/kubernetes/kubernetes.mdx
@@ -1,6 +1,7 @@
---
title: Deploy to Kubernetes clusters
-description: Learn how to publish and deploy your Aspire application to an existing Kubernetes cluster using Helm charts.
+seoTitle: Deploy Aspire apps to a Kubernetes cluster with Helm
+description: Publish and deploy your Aspire application to an existing Kubernetes cluster using Helm — generated charts, values overrides, secrets, and release management workflows.
---
import { Aside, FileTree, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -45,8 +46,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" {5}
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5}
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -82,8 +83,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" {5-6}
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5-6}
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -224,7 +225,7 @@ builder.AddKubernetesEnvironment("k8s")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const k8s = await builder.addKubernetesEnvironment('k8s');
await k8s.withHelm(async (helm) => {
await helm.withNamespace('my-namespace');
@@ -252,7 +253,7 @@ builder.AddContainer("ml-worker", "my-ml-image")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const k8s = await builder.addKubernetesEnvironment('k8s');
const gpuPool = await k8s.addNodePool('gpu');
@@ -288,7 +289,7 @@ builder.AddContainer("service", "nginx")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const service = await builder.addContainer('service', 'nginx');
await service.withEnvironment('MY_ENV', 'value');
await service.publishAsKubernetesService(async (resource) => {
diff --git a/src/frontend/src/content/docs/deployment/pipelines.mdx b/src/frontend/src/content/docs/deployment/pipelines.mdx
index a106f82f6..19fdfef8c 100644
--- a/src/frontend/src/content/docs/deployment/pipelines.mdx
+++ b/src/frontend/src/content/docs/deployment/pipelines.mdx
@@ -1,6 +1,7 @@
---
title: Pipelines and app topology
-description: Learn how Aspire's unified app topology works across development and production environments.
+seoTitle: Aspire deployment pipelines and app topology overview
+description: "Learn how Aspire's unified app topology works across development and production environments — pipelines, targets, and the resource graph that drives every deployment."
tableOfContents:
maxHeadingLevel: 2
lastUpdated: true
diff --git a/src/frontend/src/content/docs/diagnostics/aspire001.mdx b/src/frontend/src/content/docs/diagnostics/aspire001.mdx
index 0dd0632a4..e3146af4e 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRE001
-description: Learn more about compiler Warning ASPIRE001. The code language isn't fully supported by Aspire - some code generation targets will not run, so will require manual authoring.
+seoTitle: "ASPIRE001: The code language isn't fully supported by Aspire"
+description: "Learn what causes the Aspire compiler warning ASPIRE001 — the code language isn't fully supported by Aspire — and how to fix it in your AppHost."
---
import { Aside, Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire002.mdx b/src/frontend/src/content/docs/diagnostics/aspire002.mdx
index aee0aaa0f..5ca9d7ec9 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire002.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire002.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRE002
-description: Learn more about compiler Warning ASPIRE002. Project is an Aspire AppHost project but necessary dependencies aren't present. Are you missing an Aspire.Hosting.AppHost PackageReference?
+seoTitle: "ASPIRE002: Project is an Aspire AppHost project but"
+description: Learn what causes the Aspire compiler warning ASPIRE002 and how to fix it so your AppHost builds cleanly. Resolve or suppress it to keep your Aspire build.
---
import { Aside, Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire003.mdx b/src/frontend/src/content/docs/diagnostics/aspire003.mdx
index 89abdb4f1..5466b0398 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire003.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire003.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRE003
-description: Learn more about compiler Warning ASPIRE003. This project requires Visual Studio version '17.10' or higher to work properly.
+seoTitle: "ASPIRE003: This project requires Visual Studio version"
+description: "Learn what causes the Aspire compiler warning ASPIRE003 — this project requires Visual Studio version '17.10' or higher to work properly."
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire004.mdx b/src/frontend/src/content/docs/diagnostics/aspire004.mdx
index be906f0d2..35711e513 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire004.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire004.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRE004
-description: Learn more about compiler Warning ASPIRE004. Project is referenced by an Aspire Host project, but it is not an executable.
+seoTitle: "ASPIRE004: Project is referenced by an Aspire Host project"
+description: Learn what causes the Aspire compiler warning ASPIRE004 — project is referenced by an Aspire Host project, but it is not an executable.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire006.mdx b/src/frontend/src/content/docs/diagnostics/aspire006.mdx
index f01f659fc..e989f2329 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire006.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire006.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRE006
-description: Learn more about compiler Error ASPIRE006. The resource name is invalid.
+seoTitle: "ASPIRE006: Resource name is invalid · Aspire"
+description: Learn what causes Aspire compiler error ASPIRE006 — invalid AppHost resource names — and how to fix the issue by following Aspire naming constraints and conventions.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire007.mdx b/src/frontend/src/content/docs/diagnostics/aspire007.mdx
index abccef1e7..d6a6a1eb2 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire007.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire007.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRE007
-description: Learn more about compiler Error ASPIRE007. The project is missing a required Aspire.AppHost.Sdk with a version of at least 9.0.0.
+seoTitle: "ASPIRE007: The project is missing a required"
+description: Learn what causes the Aspire compiler error ASPIRE007 — the project is missing a required Aspire.AppHost.Sdk with a version of at least 9.0.0.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspire008.mdx b/src/frontend/src/content/docs/diagnostics/aspire008.mdx
index 5c97a333b..c10b86c5f 100644
--- a/src/frontend/src/content/docs/diagnostics/aspire008.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspire008.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRE008
-description: Learn more about compiler Error ASPIRE008. The project requires GenerateAssemblyInfo to be enabled for the AppHost to function correctly.
+seoTitle: "ASPIRE008: The project requires GenerateAssemblyInfo to be"
+description: Learn what causes the Aspire compiler error ASPIRE008 — the project requires GenerateAssemblyInfo to be enabled for the AppHost to function correctly.
---
import { Aside, Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireacadomains001.mdx b/src/frontend/src/content/docs/diagnostics/aspireacadomains001.mdx
index e34b1603a..271a6d652 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireacadomains001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireacadomains001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREACADOMAINS001
-description: Learn more about compiler Error ASPIREACADOMAINS001. ConfigureCustomDomain is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIREACADOMAINS001: ConfigureCustomDomain is for evaluation"
+description: Learn what causes the Aspire compiler error ASPIREACADOMAINS001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireats001.mdx b/src/frontend/src/content/docs/diagnostics/aspireats001.mdx
index f183d52ee..16ce6c2fa 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireats001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireats001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREATS001
-description: Learn more about compiler Warning ASPIREATS001. ATS (Aspire Type Specification) types are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREATS001: ATS (Aspire Type Specification) types are for"
+description: Learn what causes the Aspire compiler warning ASPIREATS001 and how to fix it so your AppHost builds cleanly. Resolve or suppress it to keep your Aspire build.
---
import { Badge } from '@astrojs/starlight/components';
@@ -37,7 +38,7 @@ var spec = new RuntimeSpec
Language = "TypeScript",
DisplayName = "TypeScript (Node.js)",
CodeGenLanguage = "typescript",
- DetectionPatterns = ["apphost.ts"],
+ DetectionPatterns = ["apphost.mts"],
Execute = new CommandSpec
{
Command = "npx",
@@ -76,7 +77,7 @@ Suppress the warning with either of the following methods:
Language = "TypeScript",
DisplayName = "TypeScript (Node.js)",
CodeGenLanguage = "typescript",
- DetectionPatterns = ["apphost.ts"],
+ DetectionPatterns = ["apphost.mts"],
Execute = new CommandSpec
{
Command = "npx",
diff --git a/src/frontend/src/content/docs/diagnostics/aspireazure001.mdx b/src/frontend/src/content/docs/diagnostics/aspireazure001.mdx
index 7156c9ee7..31110cf01 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireazure001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireazure001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREAZURE001
-description: Learn more about compiler Error ASPIREAZURE001. Publishers are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREAZURE001: Publishers are for evaluation purposes only"
+description: Learn what causes the Aspire compiler error ASPIREAZURE001 — publishers are for evaluation purposes only and are subject to change or removal in future updates.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireazure002.mdx b/src/frontend/src/content/docs/diagnostics/aspireazure002.mdx
index 2d1e40a2a..74b072624 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireazure002.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireazure002.mdx
@@ -1,9 +1,10 @@
---
title: Compiler Error ASPIREAZURE002
-description: Learn more about compiler Error ASPIREAZURE002. Azure Container App Jobs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREAZURE002: Azure Container App Jobs are for evaluation"
+description: Learn what causes the Aspire compiler error ASPIREAZURE002 and how to fix it so your AppHost builds cleanly. Resolve or suppress it to keep your Aspire build.
---
-import { Badge } from '@astrojs/starlight/components';
+import { Badge, Aside } from '@astrojs/starlight/components';
+
+
> Azure Container App Jobs are for evaluation purposes only and are subject to change or removal in future updates. Suppress this diagnostic to proceed.
The Aspire Azure hosting integration now ships with support for Azure Container App Jobs. If you're using any of the `PublishAsAzureContainerAppJob` APIs, you might see a compiler error/warning indicating that the API is experimental. This behavior is expected, as the API is still in preview and the shape of this API is expected to change in the future.
diff --git a/src/frontend/src/content/docs/diagnostics/aspireazure003.mdx b/src/frontend/src/content/docs/diagnostics/aspireazure003.mdx
index ead4c5a81..a8ad2c806 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireazure003.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireazure003.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREAZURE003
-description: Learn more about compiler Error ASPIREAZURE003. Azure Virtual Network types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREAZURE003: Azure Virtual Network types and members are"
+description: Learn what causes the Aspire compiler error ASPIREAZURE003 and how to fix it so your AppHost builds cleanly. Resolve or suppress it to keep your Aspire build.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirebrowserlogs001.mdx b/src/frontend/src/content/docs/diagnostics/aspirebrowserlogs001.mdx
index c53a6d2a5..0a62233fd 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirebrowserlogs001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirebrowserlogs001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREBROWSERLOGS001
-description: Learn more about compiler Error ASPIREBROWSERLOGS001. Browser logs types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREBROWSERLOGS001: Browser logs types and members are for"
+description: Learn what causes the Aspire compiler error ASPIREBROWSERLOGS001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecertificates001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecertificates001.mdx
index 81c15936f..1194ffce4 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecertificates001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecertificates001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRECERTIFICATES001
-description: Learn more about compiler Warning ASPIRECERTIFICATES001. Certificate configuration types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIRECERTIFICATES001: Certificate configuration types and"
+description: Learn what causes the Aspire compiler warning ASPIRECERTIFICATES001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecompute001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecompute001.mdx
index ab1a30178..fed44eb56 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecompute001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecompute001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRECOMPUTE001
-description: Learn more about compiler Error ASPIRECOMPUTE001. Compute related types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIRECOMPUTE001: Compute related types and members are for"
+description: Learn what causes the Aspire compiler error ASPIRECOMPUTE001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecompute002.mdx b/src/frontend/src/content/docs/diagnostics/aspirecompute002.mdx
index 4c631256e..f3a2f1887 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecompute002.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecompute002.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRECOMPUTE002
-description: Learn more about compiler Warning ASPIRECOMPUTE002. The GetHostAddressExpression method is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIRECOMPUTE002: The GetHostAddressExpression method is for"
+description: Learn what causes the Aspire compiler warning ASPIRECOMPUTE002 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecompute003.mdx b/src/frontend/src/content/docs/diagnostics/aspirecompute003.mdx
index ab670d54d..cfa331413 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecompute003.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecompute003.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRECOMPUTE003
-description: Learn more about compiler Warning ASPIRECOMPUTE003. The ContainerRegistryResource type is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIRECOMPUTE003: The ContainerRegistryResource type is for"
+description: Learn what causes the Aspire compiler warning ASPIRECOMPUTE003 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecontainerruntime001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecontainerruntime001.mdx
index c60b7a822..027ea5e4e 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecontainerruntime001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecontainerruntime001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRECONTAINERRUNTIME001
-description: Learn more about compiler Warning ASPIRECONTAINERRUNTIME001. The container runtime APIs are experimental and subject to change.
+seoTitle: "ASPIRECONTAINERRUNTIME001: The container runtime APIs are"
+description: Learn what causes the Aspire compiler warning ASPIRECONTAINERRUNTIME001 — the container runtime APIs are experimental and subject to change.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecontainershellexecution001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecontainershellexecution001.mdx
index 604b0fdd4..9236fd790 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecontainershellexecution001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecontainershellexecution001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIRECONTAINERSHELLEXECUTION001
-description: Learn more about compiler Warning ASPIRECONTAINERSHELLEXECUTION001. The container shell execution property is experimental and subject to change.
+seoTitle: "ASPIRECONTAINERSHELLEXECUTION001: The container shell"
+description: Learn what causes the Aspire compiler warning ASPIRECONTAINERSHELLEXECUTION001 — the container shell execution property is experimental and subject to change.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecosmosdb001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecosmosdb001.mdx
index 757e5dfc3..2ddf866c7 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecosmosdb001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecosmosdb001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRECOSMOSDB001
-description: Learn more about compiler Error ASPIRECOSMOSDB001. `RunAsPreviewEmulator` is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIRECOSMOSDB001: `RunAsPreviewEmulator` is for evaluation"
+description: Learn what causes the Aspire compiler error ASPIRECOSMOSDB001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirecsharpapps001.mdx b/src/frontend/src/content/docs/diagnostics/aspirecsharpapps001.mdx
index f0221f67c..1b7113433 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirecsharpapps001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirecsharpapps001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIRECSHARPAPPS001
-description: Learn more about compiler Error ASPIRECSHARPAPPS001. `AddCSharpApp` is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIRECSHARPAPPS001: `AddCSharpApp` is for evaluation"
+description: Learn what causes the Aspire compiler error ASPIRECSHARPAPPS001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspiredockerfilebuilder001.mdx b/src/frontend/src/content/docs/diagnostics/aspiredockerfilebuilder001.mdx
index 7b7de2c6b..104adde39 100644
--- a/src/frontend/src/content/docs/diagnostics/aspiredockerfilebuilder001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspiredockerfilebuilder001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREDOCKERFILEBUILDER001
-description: Learn more about compiler Warning ASPIREDOCKERFILEBUILDER001. Dockerfile builder types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREDOCKERFILEBUILDER001: Dockerfile builder types and"
+description: Learn what causes the Aspire compiler warning ASPIREDOCKERFILEBUILDER001 and how to fix it so your AppHost builds cleanly.
---
import { Badge, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -63,9 +64,9 @@ builder.AddDockerfileBuilder("my-service", "./service", context =>
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import type { DockerfileBuilderCallbackContext } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -111,9 +112,9 @@ builder.AddContainer("my-service", "node:22-alpine")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import type { DockerfileBuilderCallbackContext } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/diagnostics/aspiredotnettool.mdx b/src/frontend/src/content/docs/diagnostics/aspiredotnettool.mdx
index eae7862fa..68f32c77f 100644
--- a/src/frontend/src/content/docs/diagnostics/aspiredotnettool.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspiredotnettool.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREDOTNETTOOL
-description: Learn more about compiler Warning ASPIREDOTNETTOOL. .NET tool resource types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREDOTNETTOOL: Learn more about compiler Warning"
+description: Learn what causes the Aspire compiler warning ASPIREDOTNETTOOL and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspiredurabletask001.mdx b/src/frontend/src/content/docs/diagnostics/aspiredurabletask001.mdx
index a4b9e8cf8..c71fcce07 100644
--- a/src/frontend/src/content/docs/diagnostics/aspiredurabletask001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspiredurabletask001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREDURABLETASK001
-description: Learn more about compiler Warning ASPIREDURABLETASK001. Durable Task scheduler and task hub APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREDURABLETASK001: Durable Task scheduler and task hub"
+description: Learn what causes the Aspire compiler warning ASPIREDURABLETASK001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport001.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport001.mdx
index 90e4eb6a0..683262b88 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREEXPORT001
-description: Learn more about compiler Error ASPIREEXPORT001. A method marked with [AspireExport] must be static.
+seoTitle: "ASPIREEXPORT001: A method marked with [AspireExport] must be"
+description: Learn what causes the Aspire compiler error ASPIREEXPORT001 — a method marked with [AspireExport] must be static — and how to fix it in your AppHost.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport002.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport002.mdx
index 46b96e1f9..b3f3ddfc8 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport002.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport002.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREEXPORT002
-description: Learn more about compiler Error ASPIREEXPORT002. The export ID format is invalid and must be a valid identifier.
+seoTitle: "ASPIREEXPORT002: The export ID format is invalid and must be"
+description: Learn what causes the Aspire compiler error ASPIREEXPORT002 — the export ID format is invalid and must be a valid identifier.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport003.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport003.mdx
index e30912530..044796309 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport003.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport003.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREEXPORT003
-description: Learn more about compiler Error ASPIREEXPORT003. The return type of an [AspireExport] method is not ATS-compatible.
+seoTitle: "ASPIREEXPORT003: The return type of an [AspireExport] method"
+description: Learn what causes the Aspire compiler error ASPIREEXPORT003 — the return type of an [AspireExport] method is not ATS-compatible.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport004.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport004.mdx
index 5fa7f9afe..cdb39da58 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport004.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport004.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREEXPORT004
-description: Learn more about compiler Error ASPIREEXPORT004. A parameter type in an [AspireExport] method is not ATS-compatible.
+seoTitle: "ASPIREEXPORT004: A parameter type in an [AspireExport]"
+description: Learn what causes the Aspire compiler error ASPIREEXPORT004 — a parameter type in an [AspireExport] method is not ATS-compatible.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport005.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport005.mdx
index 6b14d4525..587b08656 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport005.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport005.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT005
-description: Learn more about compiler Warning ASPIREEXPORT005. An [AspireUnion] attribute requires at least 2 types.
+seoTitle: "ASPIREEXPORT005: An [AspireUnion] attribute requires at"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT005 — an [AspireUnion] attribute requires at least 2 types — and how to fix it in your AppHost.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport006.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport006.mdx
index 05b218c60..ec676c04a 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport006.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport006.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT006
-description: Learn more about compiler Warning ASPIREEXPORT006. A type in an [AspireUnion] attribute is not ATS-compatible.
+seoTitle: "ASPIREEXPORT006: A type in an [AspireUnion] attribute is not"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT006 — a type in an [AspireUnion] attribute is not ATS-compatible — and how to fix it in your AppHost.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport007.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport007.mdx
index e6e2a9485..721327a96 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport007.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport007.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT007
-description: Learn more about compiler Warning ASPIREEXPORT007. Duplicate export ID detected for the same target type.
+seoTitle: "ASPIREEXPORT007: Duplicate export ID detected for the same"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT007 — duplicate export ID detected for the same target type — and how to fix it in your AppHost.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport008.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport008.mdx
index ce53d8e0d..f4b78e5fc 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport008.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport008.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT008
-description: Learn more about compiler Warning ASPIREEXPORT008. A public extension method on an exported type is missing [AspireExport] or [AspireExportIgnore].
+seoTitle: "ASPIREEXPORT008: A public extension method on an exported"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT008 — a public extension method on an exported type is missing [AspireExport] or [AspireExportIgnore].
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport009.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport009.mdx
index d9fd662dd..57f9dff2b 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport009.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport009.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT009
-description: Learn more about compiler Warning ASPIREEXPORT009. The export name may collide with names from other integrations.
+seoTitle: "ASPIREEXPORT009: The export name may collide with names from"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT009 — the export name may collide with names from other integrations.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport010.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport010.mdx
index 1383054ce..ab7ae62f7 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport010.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport010.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT010
-description: Learn more about compiler Warning ASPIREEXPORT010. A synchronous callback parameter is invoked inline and may deadlock in multi-language app hosts.
+seoTitle: "ASPIREEXPORT010: A synchronous callback parameter is invoked"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT010 — a synchronous callback parameter is invoked inline and may deadlock in multi-language app hosts.
---
import { Badge } from '@astrojs/starlight/components';
@@ -70,6 +71,24 @@ public static IResourceBuilder WithConfiguration(
}
```
+**Option 3:** Set `RunSyncOnBackgroundThread = true` on the export to run the method invocation on a background thread, allowing the JSON-RPC dispatcher to continue processing nested callback responses:
+
+```csharp title="C# — Integration.cs"
+[AspireExport("withConfiguration", RunSyncOnBackgroundThread = true)]
+public static IResourceBuilder WithConfiguration(
+ IResourceBuilder builder,
+ Action configure)
+{
+ var config = new RedisConfiguration();
+ configure(config); // Safe — invocation runs off the JSON-RPC synchronization context
+ return builder.WithEnvironment("REDIS_CONFIG", config.ToConnectionString());
+}
+```
+
+:::note
+`RunSyncOnBackgroundThread = true` applies to both synchronous and async-returning exports. For async exports, it offloads the entire synchronous invocation path — including any work done before the first `await` — to a background thread. This prevents deadlocks when an async export calls a synchronous callback before yielding.
+:::
+
## Suppress the warning
Suppress the warning with either of the following methods:
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport013.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport013.mdx
index b41c4adca..6a93279e7 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireexport013.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport013.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXPORT013
-description: Learn more about compiler Warning ASPIREEXPORT013. A polyglot capability ID is defined by multiple exports in the same assembly.
+seoTitle: "ASPIREEXPORT013: A polyglot capability ID is defined by"
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT013 — a polyglot capability ID is defined by multiple exports in the same assembly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport015.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport015.mdx
new file mode 100644
index 000000000..f8050c4e5
--- /dev/null
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport015.mdx
@@ -0,0 +1,92 @@
+---
+title: Compiler Error ASPIREEXPORT015
+seoTitle: 'ASPIREEXPORT015: AspireExport Description should use XML docs'
+description: Learn what causes the Aspire compiler error ASPIREEXPORT015 — AspireExport Description is compatibility metadata — and how to fix it.
+---
+
+import { Badge } from '@astrojs/starlight/components';
+
+
+
+> AspireExport Description is compatibility metadata. Use XML documentation with ATS tags such as `` for generated polyglot SDK documentation.
+
+This diagnostic error is reported when a new `[AspireExport]` attribute sets the `Description` property. Starting in Aspire 13.4, the ATS scanner uses XML doc comments as the primary source for generated polyglot SDK documentation. The `Description` property is supported only as a compatibility fallback and should not be used on new exports.
+
+## Example
+
+The following code generates `ASPIREEXPORT015`:
+
+```csharp title="C# — Integration.cs"
+[AspireExport("addRedis", Description = "Adds a Redis container resource")]
+public static IResourceBuilder AddRedis(
+ this IDistributedApplicationBuilder builder,
+ string name)
+{
+ // ...
+}
+```
+
+## To correct this warning
+
+Replace the `Description` property with XML doc comments. Use ``, ``, and `` override tags when the standard C# documentation contains C#-specific constructs (such as `` links to C# types) that don't translate well to polyglot SDKs:
+
+```csharp title="C# — Integration.cs (corrected)"
+/// Adds a Redis container resource.
+/// The distributed application builder.
+/// The Redis resource name.
+/// The Redis resource builder.
+[AspireExport("addRedis")]
+public static IResourceBuilder AddRedis(
+ this IDistributedApplicationBuilder builder,
+ string name)
+{
+ // ...
+}
+```
+
+When the standard `` references C#-specific types, use `` to provide a language-neutral description for the generated SDK while keeping the original `` for C# tooling:
+
+```csharp title="C# — Using ats-summary override"
+/// Adds a Redis container resource.
+///
+/// Adds a to the .
+///
+/// The distributed application builder.
+/// The Redis resource name.
+/// The Redis resource builder.
+[AspireExport("addRedis")]
+public static IResourceBuilder AddRedis(
+ this IDistributedApplicationBuilder builder,
+ string name)
+{
+ // ...
+}
+```
+
+For more details on documenting exports for polyglot SDKs, see [Multi-language integrations](/extensibility/multi-language-integration-authoring/#document-your-exports).
+
+## Suppress the error
+
+Suppress the error with either of the following methods:
+
+- Set the severity of the rule in the _.editorconfig_ file.
+
+ ```ini title=".editorconfig"
+ [*.{cs,vb}]
+ dotnet_diagnostic.ASPIREEXPORT015.severity = none
+ ```
+
+ For more information about editor config files, see [Configuration files for code analysis rules](/diagnostics/overview/#suppress-in-the-editorconfig-file).
+
+- Add the following `PropertyGroup` to your project file:
+
+ ```xml title="C# project file"
+
+ $(NoWarn);ASPIREEXPORT015
+
+ ```
diff --git a/src/frontend/src/content/docs/diagnostics/aspireexport016.mdx b/src/frontend/src/content/docs/diagnostics/aspireexport016.mdx
new file mode 100644
index 000000000..aed72774b
--- /dev/null
+++ b/src/frontend/src/content/docs/diagnostics/aspireexport016.mdx
@@ -0,0 +1,63 @@
+---
+title: Compiler Warning ASPIREEXPORT016
+seoTitle: 'ASPIREEXPORT016: AspireDto collections need init setters'
+description: Learn what causes the Aspire compiler warning ASPIREEXPORT016 — a get-only mutable collection on an AspireDto — and how to fix it.
+---
+
+import { Badge } from '@astrojs/starlight/components';
+
+
+
+> DTO property '{0}' is a get-only mutable collection. Add an init accessor so System.Text.Json replaces the collection during DTO deserialization; otherwise collection values can be merged with initializer defaults.
+
+This diagnostic warning is reported when an `[AspireDto]` type exposes a mutable collection property with only a getter. During DTO deserialization, `System.Text.Json` can populate the existing collection instead of replacing it. If the collection has initializer defaults, deserialized values can be merged with those defaults and produce unexpected DTO state.
+
+## Example
+
+The following code generates `ASPIREEXPORT016`:
+
+```csharp title="C# — MyDto.cs"
+[AspireDto]
+public class MyDto
+{
+ public List Items { get; } = new();
+}
+```
+
+## To correct this warning
+
+Add an `init` accessor so `System.Text.Json` can replace the mutable collection during deserialization:
+
+```csharp title="C# — MyDto.cs"
+[AspireDto]
+public class MyDto
+{
+ public List Items { get; init; } = new();
+}
+```
+
+## Suppress the warning
+
+Suppress the warning with either of the following methods:
+
+- Set the severity of the rule in the _.editorconfig_ file.
+
+ ```ini title=".editorconfig"
+ [*.{cs,vb}]
+ dotnet_diagnostic.ASPIREEXPORT016.severity = none
+ ```
+
+ For more information about editor config files, see [Configuration files for code analysis rules](/diagnostics/overview/#suppress-in-the-editorconfig-file).
+
+- Add the following `PropertyGroup` to your project file:
+
+ ```xml title="C# project file"
+
+ $(NoWarn);ASPIREEXPORT016
+
+ ```
diff --git a/src/frontend/src/content/docs/diagnostics/aspireextension001.mdx b/src/frontend/src/content/docs/diagnostics/aspireextension001.mdx
index 020f63e88..8423af112 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireextension001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireextension001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREEXTENSION001
-description: Learn more about compiler Warning ASPIREEXTENSION001. Extension debugging support APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREEXTENSION001: Extension debugging support APIs are for"
+description: Learn what causes the Aspire compiler warning ASPIREEXTENSION001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirefilesystem001.mdx b/src/frontend/src/content/docs/diagnostics/aspirefilesystem001.mdx
index 549ce517f..2980f240e 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirefilesystem001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirefilesystem001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREFILESYSTEM001
-description: Learn more about compiler Warning ASPIREFILESYSTEM001. File system service types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREFILESYSTEM001: File system service types and members"
+description: Learn what causes the Aspire compiler warning ASPIREFILESYSTEM001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirehostingpython001.mdx b/src/frontend/src/content/docs/diagnostics/aspirehostingpython001.mdx
index ad92589ba..fb054ceb0 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirehostingpython001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirehostingpython001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREHOSTINGPYTHON001
-description: Learn more about compiler Error ASPIREHOSTINGPYTHON001. `AddPythonApp` is for evaluation purposes only and is subject to change or removal in future updates.
+seoTitle: "ASPIREHOSTINGPYTHON001: `AddPythonApp` is for evaluation"
+description: Learn what causes the Aspire compiler error ASPIREHOSTINGPYTHON001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireinteraction001.mdx b/src/frontend/src/content/docs/diagnostics/aspireinteraction001.mdx
index 56ef5525f..cea873111 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireinteraction001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireinteraction001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREINTERACTION001
-description: Learn more about compiler Warning ASPIREINTERACTION001. Interaction service types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREINTERACTION001: Interaction service types and members"
+description: Learn what causes the Aspire compiler warning ASPIREINTERACTION001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirejavascript001.mdx b/src/frontend/src/content/docs/diagnostics/aspirejavascript001.mdx
index 89bc42c79..a89deb170 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirejavascript001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirejavascript001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREJAVASCRIPT001
-description: Learn more about compiler Warning ASPIREJAVASCRIPT001. JavaScript hosting APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREJAVASCRIPT001: JavaScript hosting APIs are for"
+description: Learn what causes the Aspire compiler warning ASPIREJAVASCRIPT001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspiremcp001.mdx b/src/frontend/src/content/docs/diagnostics/aspiremcp001.mdx
index 423d9691b..4fd14e210 100644
--- a/src/frontend/src/content/docs/diagnostics/aspiremcp001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspiremcp001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREMCP001
-description: Learn more about compiler Warning ASPIREMCP001. MCP server types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREMCP001: MCP server types and members are for"
+description: Learn what causes the Aspire compiler warning ASPIREMCP001 and how to fix it so your AppHost builds cleanly. Resolve or suppress it to keep your Aspire build.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepipelines001.mdx b/src/frontend/src/content/docs/diagnostics/aspirepipelines001.mdx
index e547c3a83..43453e487 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepipelines001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepipelines001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREPIPELINES001
-description: Learn more about compiler Error ASPIREPIPELINES001. Pipeline infrastructure APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPIPELINES001: Pipeline infrastructure APIs are for"
+description: Learn what causes the Aspire compiler error ASPIREPIPELINES001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepipelines002.mdx b/src/frontend/src/content/docs/diagnostics/aspirepipelines002.mdx
index 20fa7c8ff..9e61a754b 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepipelines002.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepipelines002.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREPIPELINES002
-description: Learn more about compiler Error ASPIREPIPELINES002. Deployment state manager APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPIPELINES002: Deployment state manager APIs are for"
+description: Learn what causes the Aspire compiler error ASPIREPIPELINES002 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepipelines003.mdx b/src/frontend/src/content/docs/diagnostics/aspirepipelines003.mdx
index c04df4424..4c3e3ac86 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepipelines003.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepipelines003.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREPIPELINES003
-description: Learn more about compiler Error ASPIREPIPELINES003. Container image build APIs are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPIPELINES003: Container image build APIs are for"
+description: Learn what causes the Aspire compiler error ASPIREPIPELINES003 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepipelines004.mdx b/src/frontend/src/content/docs/diagnostics/aspirepipelines004.mdx
index d56e4641b..1f079fb34 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepipelines004.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepipelines004.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREPIPELINES004
-description: Learn more about compiler Warning ASPIREPIPELINES004. The pipeline output service APIs are experimental and subject to change.
+seoTitle: "ASPIREPIPELINES004: The pipeline output service APIs are"
+description: Learn what causes the Aspire compiler warning ASPIREPIPELINES004 — the pipeline output service APIs are experimental and subject to change.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepostgres001.mdx b/src/frontend/src/content/docs/diagnostics/aspirepostgres001.mdx
index b4472d6b8..8cdc4fd67 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepostgres001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepostgres001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREPOSTGRES001
-description: Learn more about compiler Warning ASPIREPOSTGRES001. The PostgreSQL MCP integration APIs are experimental and subject to change.
+seoTitle: "ASPIREPOSTGRES001: The PostgreSQL MCP integration APIs are"
+description: Learn what causes the Aspire compiler warning ASPIREPOSTGRES001 — the PostgreSQL MCP integration APIs are experimental and subject to change.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireprobes001.mdx b/src/frontend/src/content/docs/diagnostics/aspireprobes001.mdx
index 0d4b24f3a..13487c614 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireprobes001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireprobes001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREPROBES001
-description: Learn more about compiler Warning ASPIREPROBES001. Probe-related types and members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPROBES001: Probe-related types and members are for"
+description: Learn what causes the Aspire compiler warning ASPIREPROBES001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireprocesscommand001.mdx b/src/frontend/src/content/docs/diagnostics/aspireprocesscommand001.mdx
new file mode 100644
index 000000000..6f80f3f4f
--- /dev/null
+++ b/src/frontend/src/content/docs/diagnostics/aspireprocesscommand001.mdx
@@ -0,0 +1,77 @@
+---
+title: Compiler Warning ASPIREPROCESSCOMMAND001
+seoTitle: "ASPIREPROCESSCOMMAND001: Process command types and members"
+description: Learn what causes the Aspire compiler warning ASPIREPROCESSCOMMAND001 and how to fix it so your AppHost builds cleanly.
+---
+
+import { Badge } from '@astrojs/starlight/components';
+
+
+
+> Process command types and members are for evaluation purposes only and are subject to change or removal in future updates. Suppress this diagnostic to proceed.
+
+This diagnostic warning is reported when using the experimental `WithProcessCommand` extension method and related process command APIs. These APIs enable AppHost authors to expose custom resource commands backed by local processes (binaries, shell scripts, and other executables on the AppHost machine).
+
+The following APIs are protected by this diagnostic:
+
+- `WithProcessCommand` on `IResourceBuilder` — registers a command that starts a local process when invoked
+- `ProcessCommandSpec` — describes the process to start, including executable path, arguments, environment variables, working directory, and stdin content
+- `ProcessCommandOptions` — controls command behavior such as the maximum captured output line count, success exit codes, and how the result is displayed
+
+## Example
+
+The following code generates `ASPIREPROCESSCOMMAND001`:
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddRedis("cache")
+ .WithProcessCommand(
+ name: "dotnet-version",
+ displayName: "Show .NET version",
+ executablePath: "dotnet",
+ arguments: ["--version"]);
+
+builder.Build().Run();
+```
+
+The diagnostic is triggered because `WithProcessCommand`, `ProcessCommandSpec`, and `ProcessCommandOptions` are all marked with the `[Experimental("ASPIREPROCESSCOMMAND001")]` attribute.
+
+## To correct this warning
+
+Suppress the warning with one of the following methods:
+
+- Set the severity of the rule in the _.editorconfig_ file.
+
+ ```ini title=".editorconfig"
+ [*.{cs,vb}]
+ dotnet_diagnostic.ASPIREPROCESSCOMMAND001.severity = none
+ ```
+
+ For more information about editor config files, see [Configuration files for code analysis rules](/diagnostics/overview/#suppress-in-the-editorconfig-file).
+
+- Add the following `PropertyGroup` to your project file:
+
+ ```xml title="C# project file"
+
+ $(NoWarn);ASPIREPROCESSCOMMAND001
+
+ ```
+
+- Suppress in code with the `#pragma warning disable ASPIREPROCESSCOMMAND001` directive:
+
+ ```csharp title="C# — Suppressing the warning"
+ #pragma warning disable ASPIREPROCESSCOMMAND001
+ builder.AddRedis("cache")
+ .WithProcessCommand("dotnet-version", "Show .NET version", "dotnet", ["--version"]);
+ #pragma warning restore ASPIREPROCESSCOMMAND001
+ ```
+
+## See also
+
+- [Process-backed resource commands](/fundamentals/custom-resource-commands/#process-backed-resource-commands) — Learn how to use `WithProcessCommand`
diff --git a/src/frontend/src/content/docs/diagnostics/aspireproxyendpoints001.mdx b/src/frontend/src/content/docs/diagnostics/aspireproxyendpoints001.mdx
index b64f13924..16ec22cb3 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireproxyendpoints001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireproxyendpoints001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREPROXYENDPOINTS001
-description: Learn more about compiler Error ASPIREPROXYENDPOINTS001. Members are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPROXYENDPOINTS001: Members are for evaluation purposes"
+description: Learn what causes the Aspire compiler error ASPIREPROXYENDPOINTS001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspirepublishers001.mdx b/src/frontend/src/content/docs/diagnostics/aspirepublishers001.mdx
index 8be495ea0..01df2c475 100644
--- a/src/frontend/src/content/docs/diagnostics/aspirepublishers001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspirepublishers001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Error ASPIREPUBLISHERS001
-description: Learn more about compiler Error ASPIREPUBLISHERS001. Publishers are for evaluation purposes only and are subject to change or removal in future updates.
+seoTitle: "ASPIREPUBLISHERS001: Publishers are for evaluation purposes"
+description: Learn what causes the Aspire compiler error ASPIREPUBLISHERS001 and how to fix it so your AppHost builds cleanly.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/aspireusersecrets001.mdx b/src/frontend/src/content/docs/diagnostics/aspireusersecrets001.mdx
index 646dce286..4f4afa6e4 100644
--- a/src/frontend/src/content/docs/diagnostics/aspireusersecrets001.mdx
+++ b/src/frontend/src/content/docs/diagnostics/aspireusersecrets001.mdx
@@ -1,6 +1,7 @@
---
title: Compiler Warning ASPIREUSERSECRETS001
-description: Learn more about compiler Warning ASPIREUSERSECRETS001. The user secrets manager APIs are experimental and subject to change.
+seoTitle: "ASPIREUSERSECRETS001: The user secrets manager APIs are"
+description: Learn what causes the Aspire compiler warning ASPIREUSERSECRETS001 — the user secrets manager APIs are experimental and subject to change.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/diagnostics/overview.mdx b/src/frontend/src/content/docs/diagnostics/overview.mdx
index 9dd724a44..b4eb9c3a8 100644
--- a/src/frontend/src/content/docs/diagnostics/overview.mdx
+++ b/src/frontend/src/content/docs/diagnostics/overview.mdx
@@ -1,60 +1,64 @@
---
title: Diagnostics overview
-description: Learn about the diagnostics tools and features available in Aspire.
+seoTitle: 'Aspire diagnostics overview: ASPIRE compiler diagnostics'
+description: Learn about the diagnostics tools and features available in Aspire — analyzers, compiler errors, the dashboard, structured telemetry, and troubleshooting workflows.
---
The following table lists the possible MSBuild and analyzer warnings and errors you might encounter with Aspire:
-| Diagnostic ID | Type | Description |
-| ---------------------------------------------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
-| [ASPIRE001](/diagnostics/aspire001/) | Warning | The code language isn't fully supported by Aspire, some code generation targets will not run. |
-| [ASPIRE002](/diagnostics/aspire002/) | Warning | Project is an Aspire AppHost project but necessary dependencies aren't present. Are you missing an Aspire.Hosting.AppHost PackageReference? |
-| [ASPIRE003](/diagnostics/aspire003/) | Warning | 'Project' is an Aspire AppHost project that requires Visual Studio version 17.10 or above to work correctly. |
-| [ASPIRE004](/diagnostics/aspire004/) | Warning | 'Project' is referenced by an Aspire Host project, but it is not an executable. |
-| [ASPIRE006](/diagnostics/aspire006/) | (Experimental) Error | Application model items must have valid names. |
-| [ASPIRE007](/diagnostics/aspire007/) | Error | 'Project' requires a reference to "Aspire.AppHost.Sdk" with version "9.0.0" or greater to work correctly. |
-| [ASPIRE008](/diagnostics/aspire008/) | Error | 'Project' requires GenerateAssemblyInfo to be enabled for the AppHost to function correctly. |
-| [ASPIREACADOMAINS001](/diagnostics/aspireacadomains001/) | (Experimental) Error | `ConfigureCustomDomain` is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIREATS001](/diagnostics/aspireats001/) | (Experimental) Warning | ATS (Aspire Type Specification) types are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREEXPORT001](/diagnostics/aspireexport001/) | Error | `[AspireExport]` method must be static. |
-| [ASPIREEXPORT002](/diagnostics/aspireexport002/) | Error | Invalid export ID format (must match `[a-zA-Z][a-zA-Z0-9.]*`). |
-| [ASPIREEXPORT003](/diagnostics/aspireexport003/) | Error | Return type is not ATS-compatible. |
-| [ASPIREEXPORT004](/diagnostics/aspireexport004/) | Error | Parameter type is not ATS-compatible. |
-| [ASPIREEXPORT005](/diagnostics/aspireexport005/) | Warning | `[AspireUnion]` requires at least 2 types. |
-| [ASPIREEXPORT006](/diagnostics/aspireexport006/) | Warning | Union type is not ATS-compatible. |
-| [ASPIREEXPORT007](/diagnostics/aspireexport007/) | Warning | Duplicate export ID for the same target type. |
-| [ASPIREEXPORT008](/diagnostics/aspireexport008/) | Warning | Public extension method on exported type missing `[AspireExport]` or `[AspireExportIgnore]`. |
-| [ASPIREEXPORT009](/diagnostics/aspireexport009/) | Warning | Export name may collide with other integrations. |
-| [ASPIREEXPORT010](/diagnostics/aspireexport010/) | Warning | Synchronous callback invoked inline — may deadlock in multi-language app hosts. |
-| [ASPIREAZURE001](/diagnostics/aspireazure001/) | (Experimental) Error | Publishers are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREAZURE002](/diagnostics/aspireazure002/) | (Experimental) Error | Azure Container App Jobs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREAZURE003](/diagnostics/aspireazure003/) | (Experimental) Error | Azure Virtual Network types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREBROWSERLOGS001](/diagnostics/aspirebrowserlogs001/) | (Experimental) Error | Browser logs types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIRECERTIFICATES001](/diagnostics/aspirecertificates001/) | (Experimental) Warning | Certificate configuration types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIRECOMPUTE001](/diagnostics/aspirecompute001/) | (Experimental) Error | Compute related types and members are for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECOMPUTE002](/diagnostics/aspirecompute002/) | (Experimental) Warning | The GetHostAddressExpression method is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECOMPUTE003](/diagnostics/aspirecompute003/) | (Experimental) Warning | The ContainerRegistryResource type is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECONTAINERRUNTIME001](/diagnostics/aspirecontainerruntime001/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECONTAINERSHELLEXECUTION001](/diagnostics/aspirecontainershellexecution001/) | (Experimental) Warning | Container shell execution property is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECOSMOSDB001](/diagnostics/aspirecosmosdb001/) | (Experimental) Error | `RunAsPreviewEmulator` is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIRECSHARPAPPS001](/diagnostics/aspirecsharpapps001/) | (Experimental) Error | `AddCSharpApp` is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIREDOCKERFILEBUILDER001](/diagnostics/aspiredockerfilebuilder001/) | (Experimental) Warning | Dockerfile builder types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREDOTNETTOOL](/diagnostics/aspiredotnettool/) | (Experimental) Warning | .NET tool resource types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREEXTENSION001](/diagnostics/aspireextension001/) | (Experimental) Warning | Extension debugging support APIs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREFILESYSTEM001](/diagnostics/aspirefilesystem001/) | (Experimental) Warning | File system service types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREINTERACTION001](/diagnostics/aspireinteraction001/) | (Experimental) Warning | Interaction service types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREJAVASCRIPT001](/diagnostics/aspirejavascript001/) | (Experimental) Warning | JavaScript hosting and publishing APIs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREHOSTINGPYTHON001](/diagnostics/aspirehostingpython001/) | (Experimental) Error | `AddPythonApp` is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIREMCP001](/diagnostics/aspiremcp001/) | (Experimental) Warning | MCP server types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPIPELINES001](/diagnostics/aspirepipelines001/) | (Experimental) Error | Pipeline infrastructure APIs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPIPELINES002](/diagnostics/aspirepipelines002/) | (Experimental) Error | Deployment state manager APIs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPIPELINES003](/diagnostics/aspirepipelines003/) | (Experimental) Error | Container image build APIs are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPIPELINES004](/diagnostics/aspirepipelines004/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIREPOSTGRES001](/diagnostics/aspirepostgres001/) | (Experimental) Warning | PostgreSQL MCP integration is for evaluation purposes only and is subject to change or removal in future updates. |
-| [ASPIREPROBES001](/diagnostics/aspireprobes001/) | (Experimental) Warning | Probe-related types and members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPROXYENDPOINTS001](/diagnostics/aspireproxyendpoints001/) | (Experimental) Error | ProxyEndpoint members are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREPUBLISHERS001](/diagnostics/aspirepublishers001/) | Error | Publishers are for evaluation purposes only and are subject to change or removal in future updates. |
-| [ASPIREUSERSECRETS001](/diagnostics/aspireusersecrets001/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
+| Diagnostic ID | Type | Description |
+| ---------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [ASPIRE001](/diagnostics/aspire001/) | Warning | The code language isn't fully supported by Aspire, some code generation targets will not run. |
+| [ASPIRE002](/diagnostics/aspire002/) | Warning | Project is an Aspire AppHost project but necessary dependencies aren't present. Are you missing an Aspire.Hosting.AppHost PackageReference? |
+| [ASPIRE003](/diagnostics/aspire003/) | Warning | 'Project' is an Aspire AppHost project that requires Visual Studio version 17.10 or above to work correctly. |
+| [ASPIRE004](/diagnostics/aspire004/) | Warning | 'Project' is referenced by an Aspire Host project, but it is not an executable. |
+| [ASPIRE006](/diagnostics/aspire006/) | (Experimental) Error | Application model items must have valid names. |
+| [ASPIRE007](/diagnostics/aspire007/) | Error | 'Project' requires a reference to "Aspire.AppHost.Sdk" with version "9.0.0" or greater to work correctly. |
+| [ASPIRE008](/diagnostics/aspire008/) | Error | 'Project' requires GenerateAssemblyInfo to be enabled for the AppHost to function correctly. |
+| [ASPIREACADOMAINS001](/diagnostics/aspireacadomains001/) | (Experimental) Error | `ConfigureCustomDomain` is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIREATS001](/diagnostics/aspireats001/) | (Experimental) Warning | ATS (Aspire Type Specification) types are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREEXPORT001](/diagnostics/aspireexport001/) | Error | `[AspireExport]` method must be static. |
+| [ASPIREEXPORT002](/diagnostics/aspireexport002/) | Error | Invalid export ID format (must match `[a-zA-Z][a-zA-Z0-9.]*`). |
+| [ASPIREEXPORT003](/diagnostics/aspireexport003/) | Error | Return type is not ATS-compatible. |
+| [ASPIREEXPORT004](/diagnostics/aspireexport004/) | Error | Parameter type is not ATS-compatible. |
+| [ASPIREEXPORT005](/diagnostics/aspireexport005/) | Warning | `[AspireUnion]` requires at least 2 types. |
+| [ASPIREEXPORT006](/diagnostics/aspireexport006/) | Warning | Union type is not ATS-compatible. |
+| [ASPIREEXPORT007](/diagnostics/aspireexport007/) | Warning | Duplicate export ID for the same target type. |
+| [ASPIREEXPORT008](/diagnostics/aspireexport008/) | Warning | Public extension method on exported type missing `[AspireExport]` or `[AspireExportIgnore]`. |
+| [ASPIREEXPORT009](/diagnostics/aspireexport009/) | Warning | Export name may collide with other integrations. |
+| [ASPIREEXPORT010](/diagnostics/aspireexport010/) | Warning | Synchronous callback invoked inline — may deadlock in multi-language app hosts. |
+| [ASPIREEXPORT015](/diagnostics/aspireexport015/) | Error | `[AspireExport(Description = ...)]` is deprecated — use XML doc comments instead. |
+| [ASPIREEXPORT016](/diagnostics/aspireexport016/) | Warning | DTO property is a get-only mutable collection. Add an init accessor. |
+| [ASPIREAZURE001](/diagnostics/aspireazure001/) | (Experimental) Error | Publishers are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREAZURE002](/diagnostics/aspireazure002/) | (Experimental) Error | Azure Container App Jobs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREAZURE003](/diagnostics/aspireazure003/) | (Experimental) Error | Azure Virtual Network types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREBROWSERLOGS001](/diagnostics/aspirebrowserlogs001/) | (Experimental) Error | Browser logs types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIRECERTIFICATES001](/diagnostics/aspirecertificates001/) | (Experimental) Warning | Certificate configuration types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIRECOMPUTE001](/diagnostics/aspirecompute001/) | (Experimental) Error | Compute related types and members are for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECOMPUTE002](/diagnostics/aspirecompute002/) | (Experimental) Warning | The GetHostAddressExpression method is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECOMPUTE003](/diagnostics/aspirecompute003/) | (Experimental) Warning | The ContainerRegistryResource type is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECONTAINERRUNTIME001](/diagnostics/aspirecontainerruntime001/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECONTAINERSHELLEXECUTION001](/diagnostics/aspirecontainershellexecution001/) | (Experimental) Warning | Container shell execution property is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECOSMOSDB001](/diagnostics/aspirecosmosdb001/) | (Experimental) Error | `RunAsPreviewEmulator` is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIRECSHARPAPPS001](/diagnostics/aspirecsharpapps001/) | (Experimental) Error | `AddCSharpApp` is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIREDOCKERFILEBUILDER001](/diagnostics/aspiredockerfilebuilder001/) | (Experimental) Warning | Dockerfile builder types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREDOTNETTOOL](/diagnostics/aspiredotnettool/) | (Experimental) Warning | .NET tool resource types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREEXTENSION001](/diagnostics/aspireextension001/) | (Experimental) Warning | Extension debugging support APIs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREFILESYSTEM001](/diagnostics/aspirefilesystem001/) | (Experimental) Warning | File system service types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREINTERACTION001](/diagnostics/aspireinteraction001/) | (Experimental) Warning | Interaction service types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREJAVASCRIPT001](/diagnostics/aspirejavascript001/) | (Experimental) Warning | JavaScript hosting and publishing APIs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREHOSTINGPYTHON001](/diagnostics/aspirehostingpython001/) | (Experimental) Error | `AddPythonApp` is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIREMCP001](/diagnostics/aspiremcp001/) | (Experimental) Warning | MCP server types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPIPELINES001](/diagnostics/aspirepipelines001/) | (Experimental) Error | Pipeline infrastructure APIs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPIPELINES002](/diagnostics/aspirepipelines002/) | (Experimental) Error | Deployment state manager APIs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPIPELINES003](/diagnostics/aspirepipelines003/) | (Experimental) Error | Container image build APIs are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPIPELINES004](/diagnostics/aspirepipelines004/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIREPOSTGRES001](/diagnostics/aspirepostgres001/) | (Experimental) Warning | PostgreSQL MCP integration is for evaluation purposes only and is subject to change or removal in future updates. |
+| [ASPIREPROBES001](/diagnostics/aspireprobes001/) | (Experimental) Warning | Probe-related types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPROCESSCOMMAND001](/diagnostics/aspireprocesscommand001/) | (Experimental) Warning | Process command types and members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPROXYENDPOINTS001](/diagnostics/aspireproxyendpoints001/) | (Experimental) Error | ProxyEndpoint members are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREPUBLISHERS001](/diagnostics/aspirepublishers001/) | Error | Publishers are for evaluation purposes only and are subject to change or removal in future updates. |
+| [ASPIREUSERSECRETS001](/diagnostics/aspireusersecrets001/) | (Experimental) Warning | Type is for evaluation purposes only and is subject to change or removal in future updates. |
## Suppress diagnostic
diff --git a/src/frontend/src/content/docs/docs.mdx b/src/frontend/src/content/docs/docs.mdx
index 3d06725b2..32fbf7581 100644
--- a/src/frontend/src/content/docs/docs.mdx
+++ b/src/frontend/src/content/docs/docs.mdx
@@ -1,10 +1,10 @@
---
-title: Welcome to Aspire
+title: Aspire documentation home
prev: false
next:
link: /integrations/
label: Integrations
-description: Learn how Aspire helps you model, run, observe, and deploy distributed applications across C#, TypeScript, JavaScript, Python, and more.
+description: "Browse the official Aspire documentation: get started with C# and TypeScript AppHosts, model distributed apps, deploy to Azure and Kubernetes, and observe in the dashboard."
banner:
content: |
🆕 Aspire 13.3 is here! — See what's new
diff --git a/src/frontend/src/content/docs/es/index.mdx b/src/frontend/src/content/docs/es/index.mdx
index 4463185dc..2e7a3ad8e 100644
--- a/src/frontend/src/content/docs/es/index.mdx
+++ b/src/frontend/src/content/docs/es/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 ¡Aspire 13.3 ha sido lanzado! — Ver qué hay de nuevo en Aspire 13.3.
+ 🚀 ¡Aspire 13.4 ha sido lanzado! — Ver qué hay de nuevo en Aspire 13.4.
hero:
tagline: Tu stack, simplificado.
Orquesta frontends, APIs, contenedores y bases de datos sin esfuerzo—sin reescrituras, sin límites. Extiende Aspire para impulsar cualquier proyecto.
image:
diff --git a/src/frontend/src/content/docs/extensibility/custom-resources.mdx b/src/frontend/src/content/docs/extensibility/custom-resources.mdx
index 9e85fec9b..c0b7aba83 100644
--- a/src/frontend/src/content/docs/extensibility/custom-resources.mdx
+++ b/src/frontend/src/content/docs/extensibility/custom-resources.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire custom resources
-description: Learn how to create custom resource types for the Aspire app host to model your application's unique infrastructure components.
+title: Build custom Aspire resources
+description: "Learn how to create custom resource types for the Aspire AppHost to model your application's unique services, containers, executables, and external dependencies."
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/extensibility/interaction-service.mdx b/src/frontend/src/content/docs/extensibility/interaction-service.mdx
index af1100f08..592ae398d 100644
--- a/src/frontend/src/content/docs/extensibility/interaction-service.mdx
+++ b/src/frontend/src/content/docs/extensibility/interaction-service.mdx
@@ -1,6 +1,7 @@
---
title: Interaction service (Preview)
-description: Use the interaction service API to prompt users for input, request confirmation, and display messages in the Aspire dashboard or CLI during publish and deploy.
+seoTitle: Aspire interaction service (Preview) for AppHost authors
+description: Use the Aspire interaction service to prompt users for input, request confirmation, and display messages from AppHost extensions, integrations, and custom resources.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/extensibility/multi-language-integration-authoring.mdx b/src/frontend/src/content/docs/extensibility/multi-language-integration-authoring.mdx
index f86be32fc..f0577fa9e 100644
--- a/src/frontend/src/content/docs/extensibility/multi-language-integration-authoring.mdx
+++ b/src/frontend/src/content/docs/extensibility/multi-language-integration-authoring.mdx
@@ -1,6 +1,7 @@
---
title: Multi-language integrations
-description: Learn how to annotate your Aspire hosting integration so it works with TypeScript, Python, Java, and other language AppHosts.
+seoTitle: Author multi-language Aspire integrations for AppHost
+description: Annotate your Aspire hosting integration so it works with TypeScript, Python, Java, and other languages — and learn how the generator emits language-specific SDKs.
---
import {
@@ -44,7 +45,7 @@ Your C# code runs as-is — the TypeScript SDK is a thin client that calls into
The [`📦 Aspire.Hosting.Integration.Analyzers`](https://www.nuget.org/packages/Aspire.Hosting.Integration.Analyzers) package provides build-time validation that catches common export mistakes. Add it to your integration project:
```xml title="XML — MyIntegration.csproj"
-
+allruntime; build; native; contentfiles; analyzers
@@ -62,10 +63,15 @@ Suppress the experimental diagnostic in your project file:
```
-Then annotate your extension methods with `[AspireExport]`:
+Then annotate your extension methods with `[AspireExport]` and use XML doc comments to document them for the generated polyglot SDK:
```csharp title="C# — MyDatabaseBuilderExtensions.cs"
-[AspireExport("addMyDatabase", Description = "Adds a MyDatabase container resource")]
+/// Adds a MyDatabase container resource.
+/// The distributed application builder.
+/// The MyDatabase resource name.
+/// The optional port.
+/// The MyDatabase resource builder.
+[AspireExport("addMyDatabase")]
public static IResourceBuilder AddMyDatabase(
this IDistributedApplicationBuilder builder,
[ResourceName] string name,
@@ -74,7 +80,12 @@ public static IResourceBuilder AddMyDatabase(
// Your existing implementation...
}
-[AspireExport("addDatabase", Description = "Adds a database to the MyDatabase server")]
+/// Adds a database to the MyDatabase server.
+/// The MyDatabase server resource builder.
+/// The database name.
+/// The optional database name override.
+/// The database resource builder.
+[AspireExport("addDatabase")]
public static IResourceBuilder AddDatabase(
this IResourceBuilder builder,
[ResourceName] string name,
@@ -83,7 +94,11 @@ public static IResourceBuilder AddDatabase(
// Your existing implementation...
}
-[AspireExport("withDataVolume", Description = "Adds a data volume to the MyDatabase server")]
+/// Adds a data volume to the MyDatabase server.
+/// The MyDatabase server resource builder.
+/// The optional volume name.
+/// The MyDatabase resource builder.
+[AspireExport("withDataVolume")]
public static IResourceBuilder WithDataVolume(
this IResourceBuilder builder,
string? name = null)
@@ -95,23 +110,84 @@ public static IResourceBuilder WithDataVolume(
This generates the following highlighted TypeScript APIs:
```typescript title="TypeScript — Generated SDK" {5-8}
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const db = await builder
- .addMyDatabase("db", { port: 5432 })
- .addDatabase("mydata")
- .withDataVolume();
+ .addMyDatabase('db', { port: 5432 })
+ .addDatabase('mydata')
+ .withDataVolume();
const app = await builder.build();
await app.run();
```
+### Document your exports
+
+XML doc comments are the primary source for generated polyglot SDK API documentation. The ATS scanner reads ``, ``, ``, and `` tags and includes them in the TypeScript JSDoc and other language-specific documentation generated for your integration.
+
+Use `ats-*` override tags when the standard C# XML documentation doesn't translate well to polyglot SDKs — for example, when a `` references C#-specific types or language constructs that have no direct equivalent in TypeScript. The supported overrides are:
+
+- `` — overrides `` in polyglot docs
+- `` — overrides `` for a specific parameter
+- `` — overrides ``
+- `` — overrides ``
+
+An empty `ats-*` tag intentionally suppresses the matching standard documentation in the generated SDK.
+
+```csharp title="C# — Polyglot-incompatible summary with ats-summary override"
+/// Adds a Redis container resource.
+///
+/// Adds a to the .
+///
+/// The distributed application builder.
+/// The Redis resource name.
+/// The Redis resource builder.
+[AspireExport("addRedis")]
+public static IResourceBuilder AddRedis(
+ this IDistributedApplicationBuilder builder,
+ string name)
+{
+ // ...
+}
+```
+
+#### Cross-references in ATS docs
+
+Use `` and `` to link to generated SDK elements. The `!:` prefix prevents the C# compiler from validating the custom `cref` format; ATS removes it before parsing. The supported `kind` values are `type`, `method`, and `field`. The reference path uses dot notation over generated polyglot identifiers:
+
+```csharp title="C# — Cross-references using ats-see"
+///
+/// Configures .
+///
+///
+/// See also and
+/// .
+///
+[AspireExport("configureRedis")]
+public static IResourceBuilder ConfigureRedis(
+ this IDistributedApplicationBuilder builder,
+ string name)
+{
+ // ...
+}
+```
+
+TypeScript renders these references as JSDoc `{@link ...}` links.
+
+:::note
+The `Description` property on `[AspireExport]` is still supported as a compatibility fallback, but new exports should use XML doc comments. The analyzer reports `ASPIREEXPORT015` as an error when `Description` is set on a new export.
+:::
+
### Keep capability IDs unique
The runtime dispatches multi-language calls by **capability ID**. A capability ID is more restrictive than a C# method signature: it doesn't include the C# receiver type, parameter list, or overload signature. Starting in Aspire 13.3, the analyzer reports `ASPIREEXPORT013` when two exports in the same assembly generate the same capability ID.
@@ -216,9 +292,9 @@ Generates the following TypeScript interface:
```typescript title="TypeScript — Generated interface"
export interface MyCallbackContext {
- toJSON(): MarshalledHandle;
- resource(): Promise; // getter-only → async method
- readonly tags: AspireList; // mutable collection → readonly getter
+ toJSON(): MarshalledHandle;
+ resource(): Promise; // getter-only → async method
+ readonly tags: AspireList; // mutable collection → readonly getter
}
```
@@ -235,11 +311,11 @@ Prefer getter-only properties (`=> value;` or `{ get; }` without a setter) when
## Callback context types and the ATS-first editor pattern
-When you export a method that accepts a callback (such as `withEnvironmentCallback`, `withArgsCallback`, or `withUrls`), the callback receives a *context* object. For TypeScript compatibility, context types should follow the ATS-first design:
+When you export a method that accepts a callback (such as `withEnvironmentCallback`, `withArgsCallback`, or `withUrls`), the callback receives a _context_ object. For TypeScript compatibility, context types should follow the ATS-first design:
1. Use `[AspireExport]` (not `ExposeProperties = true`) on the context class.
2. Annotate only the properties that TypeScript callers need with individual `[AspireExport]` attributes.
-3. For mutable state (environment variables, command-line arguments, URL lists), expose a small *editor* class rather than the raw collection.
+3. For mutable state (environment variables, command-line arguments, URL lists), expose a small _editor_ class rather than the raw collection.
### Defining an editor class
@@ -253,7 +329,9 @@ An editor wraps a mutable collection and exposes specific operations — typical
internal sealed class EnvironmentEditor(Dictionary environmentVariables)
{
/// Sets an environment variable.
- [AspireExport(Description = "Sets an environment variable")]
+ /// The environment variable name.
+ /// The environment variable value.
+ [AspireExport]
public void Set(
string name,
[AspireUnion(
@@ -281,15 +359,15 @@ public sealed class MyCallbackContext(
Dictionary environmentVariables)
{
/// Gets the resource associated with this callback.
- [AspireExport(Description = "Gets the resource associated with this callback")]
+ [AspireExport]
public IResource Resource => resource;
/// Gets the execution context.
- [AspireExport(Description = "Gets the execution context")]
+ [AspireExport]
public DistributedApplicationExecutionContext ExecutionContext => executionContext;
/// Gets the environment variable editor.
- [AspireExport(Description = "Gets the environment variable editor")]
+ [AspireExport]
internal EnvironmentEditor Environment => new(environmentVariables);
}
```
@@ -299,7 +377,11 @@ public sealed class MyCallbackContext(
Export the extension method that accepts the callback, using `Action` as the parameter type:
```csharp title="C# — MyResourceBuilderExtensions.cs"
-[AspireExport("withMyCallback", Description = "Configures the resource using a callback")]
+/// Configures the resource using a callback.
+/// The resource builder.
+/// The callback to configure the resource.
+/// The resource builder.
+[AspireExport("withMyCallback")]
public static IResourceBuilder WithMyCallback(
this IResourceBuilder builder,
Action configure)
@@ -312,9 +394,9 @@ The generated TypeScript API accepts an async arrow function:
```typescript title="TypeScript — Consuming the callback API"
await myResource.withMyCallback(async (context) => {
- const resource = await context.resource();
- const env = await context.environment();
- await env.set("MY_KEY", "my-value");
+ const resource = await context.resource();
+ const env = await context.environment();
+ await env.set('MY_KEY', 'my-value');
});
```
@@ -322,6 +404,115 @@ await myResource.withMyCallback(async (context) => {
The `Action` delegate type is ATS-compatible. The TypeScript side receives an async function; the Aspire runtime bridges the async TypeScript call to the synchronous C# delegate on a background thread.
:::
+## Services available from callback service providers
+
+Several ATS callback contexts expose an `IServiceProvider` handle through a `services()` or `serviceProvider()` accessor. These accessors are async `PropertyAccessor` values, so await them before using the returned service provider. For example, resource events expose `await event.services()`, command contexts expose `await context.serviceProvider()`, and `DistributedApplicationExecutionContext` exposes `await executionContext.serviceProvider()`.
+
+In TypeScript, use the ATS-friendly methods on the service provider instead of the C# generic dependency-injection pattern. For example, call `services.getLoggerFactory()` instead of `serviceProvider.GetRequiredService()`.
+
+```typescript title="TypeScript — Using a callback service provider"
+await builder.subscribeBeforeStart(async (event) => {
+ const services = await event.services();
+ const loggerFactory = services.getLoggerFactory();
+ const logger = loggerFactory.createLogger('AppHost');
+
+ logger.logInformation('The AppHost is starting.');
+});
+```
+
+The generated TypeScript SDK exposes these service-provider methods:
+
+- [`getDistributedApplicationModel()`](/reference/api/typescript/aspire.hosting/getdistributedapplicationmodel/) returns [`DistributedApplicationModel`](/reference/api/typescript/aspire.hosting/distributedapplicationmodel/). Inspect application resources with [`getResources()`](/reference/api/typescript/aspire.hosting/distributedapplicationmodel/getresources/) or locate a resource by name with [`findResourceByName()`](/reference/api/typescript/aspire.hosting/distributedapplicationmodel/findresourcebyname/).
+- [`getLoggerFactory()`](/reference/api/typescript/aspire.hosting/getloggerfactory/) returns [`ILoggerFactory`](https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.iloggerfactory). Create a named logger with [`createLogger()`](/reference/api/typescript/aspire.hosting/createlogger/), then write messages with [`logInformation()`](/reference/api/typescript/aspire.hosting/loginformation/), [`logWarning()`](/reference/api/typescript/aspire.hosting/logwarning/), [`logError()`](/reference/api/typescript/aspire.hosting/logerror/), or [`logDebug()`](/reference/api/typescript/aspire.hosting/logdebug/).
+- [`getResourceLoggerService()`](/reference/api/typescript/aspire.hosting/getresourceloggerservice/) returns [`ResourceLoggerService`](/reference/api/typescript/aspire.hosting/resourceloggerservice/). Complete resource log streams with [`completeLog()`](/reference/api/typescript/aspire.hosting/resourceloggerservice/completelog/) or [`completeLogByName()`](/reference/api/typescript/aspire.hosting/resourceloggerservice/completelogbyname/).
+- [`getResourceNotificationService()`](/reference/api/typescript/aspire.hosting/getresourcenotificationservice/) returns [`ResourceNotificationService`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/). Publish resource updates, inspect state, or wait for readiness with [`publishResourceUpdate()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/publishresourceupdate/), [`tryGetResourceState()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/trygetresourcestate/), [`waitForDependencies()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/waitfordependencies/), [`waitForResourceHealthy()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/waitforresourcehealthy/), [`waitForResourceState()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/waitforresourcestate/), or [`waitForResourceStates()`](/reference/api/typescript/aspire.hosting/resourcenotificationservice/waitforresourcestates/).
+- [`getUserSecretsManager()`](/reference/api/typescript/aspire.hosting/getusersecretsmanager/) returns [`IUserSecretsManager`](/reference/api/typescript/aspire.hosting/iusersecretsmanager/). Read user-secrets availability and path with `await secrets.isAvailable()` and `await secrets.filePath()` (or the `.get()` methods on those property accessors), set or delete secrets, and persist state with [`getOrSetSecret()`](/reference/api/typescript/aspire.hosting/iusersecretsmanager/getorsetsecret/), [`trySetSecret()`](/reference/api/typescript/aspire.hosting/iusersecretsmanager/trysetsecret/), [`tryDeleteSecret()`](/reference/api/typescript/aspire.hosting/iusersecretsmanager/trydeletesecret/), or [`saveStateJson()`](/reference/api/typescript/aspire.hosting/iusersecretsmanager/savestatejson/).
+- [`getAspireStore()`](/reference/api/typescript/aspire.hosting/getaspirestore/) returns [`IAspireStore`](/reference/api/typescript/aspire.hosting/iaspirestore/). Create deterministic file copies with [`getFileNameWithContent()`](/reference/api/typescript/aspire.hosting/iaspirestore/getfilenamewithcontent/) when generated artifacts need stable paths.
+- [`getEventing()`](/reference/api/typescript/aspire.hosting/geteventing/) returns [`IDistributedApplicationEventing`](/reference/api/typescript/aspire.hosting/idistributedapplicationeventing/). Access eventing infrastructure from callbacks, including [`unsubscribe()`](/reference/api/typescript/aspire.hosting/idistributedapplicationeventing/unsubscribe/) for event subscriptions created by builder-level helpers such as `subscribeBeforeStart()` and `subscribeAfterResourcesCreated()`.
+
+### Inspect the application model
+
+Use `getDistributedApplicationModel()` when callback code needs to inspect or locate resources in the AppHost model:
+
+```typescript title="TypeScript — Inspecting AppHost resources"
+await builder.subscribeAfterResourcesCreated(async (event) => {
+ const services = await event.services();
+ const model = services.getDistributedApplicationModel();
+ const resources = model.getResources();
+ const api = model.findResourceByName('api');
+});
+```
+
+### Write logs
+
+Use `getLoggerFactory()` to create loggers from callbacks that expose a service provider:
+
+```typescript title="TypeScript — Writing logs from a callback"
+await builder.subscribeBeforeStart(async (event) => {
+ const services = await event.services();
+ const logger = services.getLoggerFactory().createLogger('startup');
+
+ logger.logInformation('Preparing resources.');
+});
+```
+
+### Work with resource state and logs
+
+Use `getResourceNotificationService()` for resource state transitions and `getResourceLoggerService()` for resource log streams:
+
+```typescript title="TypeScript — Waiting for resource state"
+const cache = await builder.addRedis('cache');
+
+cache.onResourceReady(async (event) => {
+ const resource = await event.resource();
+ const services = await event.services();
+ const resourceName = resource.getResourceName();
+ const notifications = services.getResourceNotificationService();
+ const resourceLogs = services.getResourceLoggerService();
+
+ notifications.waitForResourceHealthy(resourceName);
+ resourceLogs.completeLog(resource);
+});
+```
+
+### Manage user secrets and generated files
+
+Use `getUserSecretsManager()` for user secrets and `getAspireStore()` for stable files created during AppHost execution:
+
+```typescript title="TypeScript — Using AppHost services"
+await builder.subscribeBeforeStart(async (event) => {
+ const services = await event.services();
+ const secrets = services.getUserSecretsManager();
+ const store = services.getAspireStore();
+ const model = services.getDistributedApplicationModel();
+ const api = model.findResourceByName('api');
+
+ if (await secrets.isAvailable()) {
+ secrets.getOrSetSecret(api, 'ApiKey', crypto.randomUUID());
+ }
+
+ const generatedFile = store.getFileNameWithContent(
+ 'seed-data.json',
+ './seed-data.json'
+ );
+});
+```
+
+### Eventing and command services
+
+Use `getEventing()` when callback code needs the eventing service itself:
+
+```typescript title="TypeScript — Using eventing from services"
+const subscription = await builder.subscribeBeforeStart(async (event) => {
+ const services = await event.services();
+ const eventing = services.getEventing();
+
+ eventing.unsubscribe(subscription);
+});
+```
+
+`ResourceCommandService` is available in the C# API reference and includes command execution APIs, but the current generated TypeScript API reference data for `Aspire.Hosting` doesn't expose a `getResourceCommandService()` service-provider method or a `ResourceCommandService` handle. Until that API appears in the generated SDK, don't fetch command services directly from TypeScript callbacks; use the exported resource command APIs such as `withCommand()`, `withHttpCommand()`, and command callback contexts instead.
+
## Export configuration DTOs
If your integration accepts structured configuration, mark the options class with `[AspireDto]`. DTOs are serialized as JSON between the TypeScript AppHost and the .NET runtime:
@@ -340,6 +531,69 @@ public sealed class AddMyDatabaseOptions
DTOs should only contain properties that can be serialized to and from JSON. Avoid using complex .NET types—such as `IConfiguration`, `ILogger`, or delegate types like `Action` and `Func`—as they are not serializable and are not suitable for DTOs.
+### Collection properties in DTOs
+
+DTO collection properties (such as `List`, `IList`, `IEnumerable`, arrays, or `Dictionary`) are generated as **value-shaped JSON types** in supported guest SDKs. This means guest code can supply plain collection literals directly rather than constructing handle-backed wrapper objects.
+
+For example, a DTO that accepts address prefix and fully qualified domain name collections:
+
+```csharp title="C# — MyAccessRule.cs"
+[AspireDto]
+public sealed class MyAccessRule
+{
+ public List AddressPrefixes { get; init; } = [];
+ public List FullyQualifiedDomainNames { get; init; } = [];
+}
+```
+
+Guest SDKs expose the collection values using each language's ordinary collection shape:
+
+
+
+
+```typescript title="TypeScript — apphost.ts"
+const rule: MyAccessRule = {
+ addressPrefixes: ['203.0.113.0/24', '198.51.100.0/24'],
+ fullyQualifiedDomainNames: ['example.com'],
+};
+```
+
+
+
+
+```python title="Python — apphost.py"
+rule: MyAccessRule = {
+ "AddressPrefixes": ["203.0.113.0/24", "198.51.100.0/24"],
+ "FullyQualifiedDomainNames": ["example.com"],
+}
+```
+
+
+
+
+```go title="Go — apphost.go"
+rule := &aspire.MyAccessRule{
+ AddressPrefixes: []string{"203.0.113.0/24", "198.51.100.0/24"},
+ FullyQualifiedDomainNames: []string{"example.com"},
+}
+```
+
+
+
+
+```java title="Java — AppHost.java"
+var rule = new MyAccessRule();
+rule.setAddressPrefixes(java.util.List.of("203.0.113.0/24", "198.51.100.0/24"));
+rule.setFullyQualifiedDomainNames(java.util.List.of("example.com"));
+```
+
+
+
+
+:::note
+This behavior applies to DTOs only. Mutable collection properties on **exported resource types** (classes annotated with `[AspireExport]`) continue to use handle-backed wrappers such as `AspireList` so that guest code can add or remove values imperatively. DTOs use value-shaped types because they are consumed as JSON input objects, not as live handles.
+:::
+
## Export value catalogs
Use `[AspireValue]` to export immutable predefined values from your integration into guest SDKs as typed catalog objects. This is useful when your integration ships well-known constants or configuration presets—such as a list of supported model names or region identifiers—that polyglot AppHost authors should be able to reference without reconstructing them manually.
@@ -394,9 +648,9 @@ The scanner snaps the values at scan time by serializing each field or property
After generating the SDK (for example, with `aspire run`), the catalog is available as a nested object in each supported language. The nesting mirrors the static class hierarchy of the C# source:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import { MyModels } from './.modules/my-integration.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import { MyModels } from './.aspire/modules/my-integration.mjs';
const builder = await createBuilder();
@@ -446,7 +700,11 @@ Some C# overloads use types that can't be represented in TypeScript (e.g., `Acti
```csharp title="C# — Exclude incompatible overloads"
// This overload works in TypeScript — simple parameters
-[AspireExport("withConnectionStringLimit", Description = "Sets connection limit")]
+/// Sets the maximum number of connections.
+/// The resource builder.
+/// The maximum number of connections.
+/// The resource builder.
+[AspireExport("withConnectionStringLimit")]
public static IResourceBuilder WithConnectionStringLimit(
this IResourceBuilder builder,
int maxConnections)
@@ -475,7 +733,12 @@ public static IResourceBuilder WithConnectionStringLimit(
When a parameter accepts multiple types, use `[AspireUnion]` to declare the valid options:
```csharp title="C# — Union type parameter"
-[AspireExport("withEnvironment", Description = "Sets an environment variable")]
+/// Sets an environment variable on the resource.
+/// The resource builder.
+/// The environment variable name.
+/// The value, which may be a string, reference expression, or endpoint reference.
+/// The resource builder.
+[AspireExport("withEnvironment")]
public static IResourceBuilder WithEnvironment(
this IResourceBuilder builder,
string name,
@@ -485,6 +748,7 @@ public static IResourceBuilder WithEnvironment(
typeof(EndpointReference),
typeof(IResourceBuilder),
typeof(IResourceBuilder),
+ typeof(IResourceBuilder),
typeof(IExpressionValue))]
object value)
where T : IResourceWithEnvironment
@@ -514,8 +778,10 @@ The `Aspire.Hosting.Integration.Analyzers` package reports these diagnostics:
| ASPIREEXPORT011 | Warning | Explicit export ID matches the convention-derived name |
| ASPIREEXPORT012 | Warning | Callback context type missing `[AspireExport]` |
| ASPIREEXPORT013 | Warning | Duplicate polyglot capability ID across exports in the same assembly |
+| ASPIREEXPORT015 | Error | `[AspireExport(Description = ...)]` is deprecated — use XML doc comments instead |
+| ASPIREEXPORT016 | Warning | DTO property is a get-only mutable collection. Add an init accessor |
-A clean build with zero analyzer warnings means your integration is ready for multi-language use.
+A clean build with zero analyzer warnings or errors means your integration is ready for multi-language use.
## Local development with project references
@@ -524,7 +790,7 @@ You can test your integration locally without publishing to a NuGet feed. In you
```json title="JSON — aspire.config.json"
{
"appHost": {
- "path": "apphost.ts",
+ "path": "apphost.mts",
"language": "typescript/nodejs"
},
"packages": {
@@ -568,12 +834,12 @@ When the CLI detects a `.csproj` path, it builds the project locally and generat
aspire run
```
-4. Check the generated `.modules/` directory for your integration's TypeScript types. Verify that your exported methods appear with the correct signatures.
+4. Check the generated `.aspire/modules/` directory for your integration's TypeScript types. Verify that your exported methods appear with the correct signatures.
-5. Use the generated API in `apphost.ts`:
+5. Use the generated API in `apphost.mts`:
- ```typescript title="TypeScript — apphost.ts"
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="TypeScript — apphost.mts"
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -591,19 +857,19 @@ When the CLI detects a `.csproj` path, it builds the project locally and generat
The following types are ATS-compatible and can be used in exported method signatures:
-| Category | Types |
-| --------------- | ---------------------------------------------------------------------------------------------------- |
-| **Primitives** | `string`, `bool`, `int`, `long`, `float`, `double`, `decimal` |
-| **Value types** | `DateTime`, `TimeSpan`, `Guid`, `Uri` |
-| **Enums** | Any enum type |
-| **Handles** | `IResourceBuilder`, `IDistributedApplicationBuilder`, resource types marked with `[AspireExport]` |
-| **DTOs** | Classes/structs marked with `[AspireDto]` |
-| **Exported values** | Static fields/properties marked with `[AspireValue]` (emitted as catalog constants in guest SDKs) |
-| **Collections** | `List`, `Dictionary`, arrays — where `T` is ATS-compatible |
-| **Delegates** | `Action`, `Func`, and other delegate types (use `RunSyncOnBackgroundThread = true` for synchronous delegates invoked inline) |
-| **Services** | `ILogger`, `IServiceProvider`, `IConfiguration` (already exported by the core framework) |
-| **Special** | `ParameterResource`, `ReferenceExpression`, `EndpointReference`, `IExpressionValue`, `CancellationToken` |
-| **Nullable** | Any of the above as nullable (`T?`) |
+| Category | Types |
+| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| **Primitives** | `string`, `bool`, `int`, `long`, `float`, `double`, `decimal` |
+| **Value types** | `DateTime`, `TimeSpan`, `Guid`, `Uri` |
+| **Enums** | Any enum type |
+| **Handles** | `IResourceBuilder`, `IDistributedApplicationBuilder`, resource types marked with `[AspireExport]` |
+| **DTOs** | Classes/structs marked with `[AspireDto]` |
+| **Exported values** | Static fields/properties marked with `[AspireValue]` (emitted as catalog constants in guest SDKs) |
+| **Collections** | `List`, `Dictionary`, arrays — where `T` is ATS-compatible |
+| **Delegates** | `Action`, `Func`, and other delegate types (use `RunSyncOnBackgroundThread = true` for exports that invoke synchronous callbacks inline, including async-returning exports that call callbacks before their first `await`) |
+| **Services** | `ILogger`, `IServiceProvider`, `IConfiguration` (already exported by the core framework) |
+| **Special** | `ParameterResource`, `ReferenceExpression`, `EndpointReference`, `IExpressionValue`, `CancellationToken` |
+| **Nullable** | Any of the above as nullable (`T?`) |
Types that are **not** ATS-compatible include: interpolated string handlers and custom complex types without `[AspireExport]` or `[AspireDto]`.
diff --git a/src/frontend/src/content/docs/fr/index.mdx b/src/frontend/src/content/docs/fr/index.mdx
index 553b7e849..f0be75ae1 100644
--- a/src/frontend/src/content/docs/fr/index.mdx
+++ b/src/frontend/src/content/docs/fr/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 est disponible ! — Découvrez les nouveautés d'Aspire 13.3.
+ 🚀 Aspire 13.4 est disponible ! — Découvrez les nouveautés d'Aspire 13.4.
hero:
tagline: Votre stack, simplifiée.
Orchestrez vos frontends, APIs, conteneurs et bases de données sans effort — sans réécriture, sans limites. Étendez Aspire pour propulser n'importe quel projet.
image:
diff --git a/src/frontend/src/content/docs/fundamentals/annotations-overview.mdx b/src/frontend/src/content/docs/fundamentals/annotations-overview.mdx
index 26676a6c9..ba181f3ad 100644
--- a/src/frontend/src/content/docs/fundamentals/annotations-overview.mdx
+++ b/src/frontend/src/content/docs/fundamentals/annotations-overview.mdx
@@ -1,6 +1,7 @@
---
title: Resource annotations
-description: Learn about annotations in Aspire, how they work, and how to create custom annotations for extending resource behavior.
+seoTitle: Aspire resource annotations overview for AppHost authors
+description: Learn how Aspire annotations work, how the AppHost composes built-in annotations, and how to create custom annotations to extend the resource model in your apps.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/fundamentals/container-networking.mdx b/src/frontend/src/content/docs/fundamentals/container-networking.mdx
index 3722c14a5..5484f6ee1 100644
--- a/src/frontend/src/content/docs/fundamentals/container-networking.mdx
+++ b/src/frontend/src/content/docs/fundamentals/container-networking.mdx
@@ -1,9 +1,10 @@
---
title: Container networking
-description: Learn how the DCP container tunnel enables reliable container-to-host communication in Aspire.
+seoTitle: Aspire container networking and DCP tunnel essentials
+description: Learn how the Aspire DCP container tunnel enables reliable container-to-host and container-to-container networking in development, including ports and service discovery.
---
-import { Aside, Steps } from '@astrojs/starlight/components';
+import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
import OsAwareTabs from '@components/OsAwareTabs.astro';
During local development, your Aspire app model often includes a mix of container resources and host-based services (such as C#, Python, or TypeScript projects). Container-to-container communication works naturally over the bridge network, but containers that need to reach services running on the host require a different approach. Aspire solves this with the **container tunnel**, a [Developer Control Plane (DCP)](/architecture/overview/#developer-control-plane) capability that provides reliable, transparent container-to-host connectivity.
@@ -40,7 +41,10 @@ At a high level, the tunnel works as follows:
This means that when you write code like the following, the container tunnel ensures `mycontainer` can reach the `api` project regardless of your operating system or container runtime:
-```csharp title="C# — AppHost.cs"
+
+
+
+```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var api = builder.AddProject("api");
@@ -51,6 +55,28 @@ builder.AddContainer("mycontainer", "myimage")
builder.Build().Run();
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addNodeApp('api', './api', 'index.js');
+
+const container = await builder.addContainer('mycontainer', {
+ image: 'myimage',
+ tag: 'latest',
+});
+await container.withReference(api);
+
+await builder.build().run();
+```
+
+
+
+
## Network identifiers
Aspire uses **network identifiers** to provide context-aware endpoint resolution. When an endpoint is resolved, the result depends on the network context of the caller—whether it's on the host, on the container bridge network, or on the public internet.
@@ -80,7 +106,14 @@ builder.Build().Run();
```
+
+
## Disable the container tunnel
diff --git a/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx b/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx
index 3f22f5d34..74ac7750e 100644
--- a/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx
+++ b/src/frontend/src/content/docs/fundamentals/custom-resource-commands.mdx
@@ -1,6 +1,7 @@
---
title: Custom resource commands
-description: Learn how to create custom resource commands in Aspire.
+seoTitle: Aspire custom resource commands in the AppHost dashboard
+description: Create custom resource commands in Aspire to add buttons and actions to the dashboard — refresh data, run scripts, and trigger workflows directly from the resource graph.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -99,12 +100,12 @@ The preceding code:
In a TypeScript AppHost, register the command inline on the resource builder. Because TypeScript doesn't have extension methods, the closure captures any state the command needs:
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
import {
createBuilder,
type ExecuteCommandContext,
type ExecuteCommandResult,
-} from './.modules/aspire.js';
+} from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -213,11 +214,11 @@ In TypeScript the callback signature is `(context: ExecuteCommandContext) => Pro
The TypeScript callback is typically defined inline as an async arrow function. The example below pulls the resource's HTTP endpoint and forwards the cancellation token to `fetch`:
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
async (context: ExecuteCommandContext): Promise => {
const endpoint = await cache.getEndpoint("http");
const url = await endpoint.url.get();
- const cancellation = await context.cancellationToken.get();
+ const cancellation = await context.cancellationToken();
const res = await fetch(`${url}/admin/cache/clear`, {
method: "POST",
@@ -292,7 +293,7 @@ The TypeScript `UpdateCommandStateContext` currently exposes only `serviceProvid
In TypeScript the `updateState` field on `CommandOptions` is typed loosely (`any`), and the SDK does not yet export a `ResourceCommandState` enum. The simplest path for TypeScript AppHosts today is to omit `updateState` entirely — commands default to enabled — and only register the command after the resource is reachable:
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await cache.withCommand(
"clear-cache",
"Clear Cache",
@@ -339,8 +340,8 @@ The preceding code calls the `WithClearCommand` extension method to add the cust
-```typescript title="apphost.ts" {5-15}
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" {5-15}
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -352,7 +353,7 @@ await cache.withCommand(
async (context) => {
const endpoint = await cache.getEndpoint("http");
const url = await endpoint.url.get();
- const cancellation = await context.cancellationToken.get();
+ const cancellation = await context.cancellationToken();
const res = await fetch(`${url}/admin/cache/clear`, {
method: "POST",
@@ -411,22 +412,21 @@ Select the **Clear cache** command to clear the cache of the Redis resource. The
## Programmatically execute commands
-
-
In addition to executing commands through the [Aspire dashboard](/dashboard/overview/), you can also execute commands programmatically using the `ResourceCommandService`. This service is useful when you need to:
- Execute commands from within your application code
- Automate command execution as part of a workflow
- Build custom tooling that needs to control resources
-The most common scenario is to call commands from within other custom command implementations. The `ExecuteCommandContext` provides access to the `IServiceProvider`, which you can use to retrieve the `ResourceCommandService`.
+The most common scenario is to call commands from within other custom command implementations. The `ExecuteCommandContext` provides access to `ServiceProvider` in C# and a `serviceProvider` async accessor in TypeScript, which you can use to retrieve the `ResourceCommandService`.
### Execute commands from a custom command
The following example shows how to create a custom command that executes other commands. In this case, a "reset-all" command clears the cache and restarts a database:
+
+
+
```csharp title="AppHost.cs"
using Aspire.Hosting.ApplicationModel;
using Microsoft.Extensions.DependencyInjection;
@@ -449,24 +449,24 @@ var api = builder.AddProject("api")
.WithCommand("reset-all", "Reset Everything", async (context, ct) =>
{
var commandService = context.ServiceProvider.GetRequiredService();
-
+
context.Logger.LogInformation("Starting full system reset...");
-
+
var clearResult = await commandService.ExecuteCommandAsync(
resource: cache.Resource,
commandName: "clear-cache",
cancellationToken: ct);
-
+
var restartResult = await commandService.ExecuteCommandAsync(
resource: database.Resource,
commandName: "restart",
cancellationToken: ct);
-
+
if (!clearResult.Success || !restartResult.Success)
{
return CommandResults.Failure("System reset failed");
}
-
+
context.Logger.LogInformation("System reset completed successfully");
return CommandResults.Success();
});
@@ -474,19 +474,65 @@ var api = builder.AddProject("api")
builder.Build().Run();
```
+
+
+
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis("cache");
+// withClearCommand defines a "clear-cache" command as shown earlier
+
+const database = await builder.addPostgres("postgres");
+await database.withCommand("restart", "Restart Database", async () => {
+ // Restart database implementation
+ return { success: true };
+});
+
+const api = await builder.addProject("api", "../Api/Api.csproj");
+await api.withReference(cache);
+await api.withReference(database);
+await api.withCommand("reset-all", "Reset Everything", async (ctx) => {
+ const serviceProvider = await ctx.serviceProvider();
+ const commandService = await serviceProvider.getResourceCommandService();
+ const cancellationToken = await ctx.cancellationToken();
+
+ const clearResult = await commandService.executeCommandAsync(
+ "cache", "clear-cache", { cancellationToken });
+
+ const restartResult = await commandService.executeCommandAsync(
+ "postgres", "restart", { cancellationToken });
+
+ if (!clearResult.success || !restartResult.success) {
+ return { success: false, message: "System reset failed" };
+ }
+
+ return { success: true };
+});
+
+await builder.build().run();
+```
+
+
+
+
In this example:
-- The `context` parameter provides access to `ServiceProvider` and `Logger`
-- `context.Logger` writes log messages directly to the resource's log stream in the Aspire dashboard — no need to resolve a logger from the service provider
+- The `context` / `ctx` parameter provides access to the service provider and logger
- The `ResourceCommandService` is retrieved from the service provider
-- Commands are executed on resource instances using `cache.Resource` and `database.Resource`
+- In C#, commands are executed on resource instances using `cache.Resource` and `database.Resource`; in TypeScript, they are executed by resource name string (for example, `"cache"` and `"postgres"`)
- Each command result is checked for success before proceeding
### Execute a command by resource ID
You can also execute a command using the resource ID or resource name. The resource ID is the unique identifier for a resource instance, while the resource name is the display name (which must be unique to use this approach):
-```csharp
+
+
+
+```csharp title="AppHost.cs"
var result = await commandService.ExecuteCommandAsync(
resourceId: "cache",
commandName: "clear-cache",
@@ -506,15 +552,39 @@ else
}
```
-The `resourceId` parameter can be either:
+
+
+
+```typescript title="apphost.mts"
+const result = await commandService.executeCommandAsync(
+ "cache",
+ "clear-cache",
+ { cancellationToken });
+
+if (result.success) {
+ console.log("Command executed successfully");
+}
+else if (result.canceled) {
+ console.warn("Command was canceled");
+}
+else {
+ console.error(`Command failed: ${result.message}`);
+}
+```
+
+
+
+
+The resource identifier argument (`resourceId` in C#, or the first argument in TypeScript) can be either:
+
- The unique ID of the resource (e.g., `cache-abcdwxyz` for a resource with replicas)
- The display name (e.g., `cache`) if there are no duplicate names
### Execute commands on resources with replicas
-When executing a command on a resource with multiple replicas using the `IResource` overload, the command runs in parallel on all instances:
+When executing a command on a resource with multiple replicas using the C# `IResource` overload, the command runs in parallel on all instances:
-```csharp
+```csharp title="AppHost.cs"
// For a resource with replicas, the command executes on all instances
var result = await commandService.ExecuteCommandAsync(
resource: cache.Resource,
@@ -522,6 +592,8 @@ var result = await commandService.ExecuteCommandAsync(
cancellationToken: cancellationToken);
```
+In TypeScript, use the resource identifier overload shown earlier: pass a specific replica ID to target one instance, or pass a unique resource name when there are no duplicate names.
+
The behavior when executing on multiple replicas:
- The command runs in parallel on all instances
- If all commands succeed, the result indicates success
@@ -664,13 +736,13 @@ builder.Build().Run();
In TypeScript, return an `ExecuteCommandResult` object literal with a `data` property of type `CommandResultData`:
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
import {
createBuilder,
CommandResultFormat,
type ExecuteCommandContext,
type ExecuteCommandResult,
-} from './.modules/aspire.js';
+} from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -695,13 +767,13 @@ await builder.build().run();
To return JSON with the expiry and scopes, switch the format to `CommandResultFormat.Json`:
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
import {
createBuilder,
CommandResultFormat,
type ExecuteCommandContext,
type ExecuteCommandResult,
-} from './.modules/aspire.js';
+} from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -761,7 +833,7 @@ return CommandResults.Failure(
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
return {
success: false,
message: "Migration failed.",
@@ -777,7 +849,7 @@ return {
### Auto-open the result dialog in the dashboard
-By default, the dashboard surfaces the payload as a **View response** action on the notification in the [notification center](/dashboard/explore/#notification-center). Set `DisplayImmediately` on `CommandResultData` to open the visualizer the moment the command completes — useful for short commands where the response _is_ the point:
+By default, the dashboard surfaces the payload as a **View response** action on the notification in the [notification center](/dashboard/explore/#notification-center). Pass `displayImmediately: true` to `CommandResults.Success` to open the visualizer the moment the command completes — useful for short commands where the response _is_ the point:
@@ -785,18 +857,15 @@ By default, the dashboard surfaces the payload as a **View response** action on
```csharp title="C# — AppHost.cs"
return CommandResults.Success(
message: "Access token issued.",
- value: new CommandResultData
- {
- Value = json,
- Format = CommandResultFormat.Json,
- DisplayImmediately = true,
- });
+ result: json,
+ resultFormat: CommandResultFormat.Json,
+ displayImmediately: true);
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
return {
success: true,
message: "Access token issued.",
@@ -846,3 +915,524 @@ else
exit 1
fi
```
+
+## Command arguments
+
+Commands can declare input arguments that the dashboard renders as a prompt dialog before execution and that the CLI accepts as ordered positional values. Arguments are defined by setting `CommandOptions.Arguments` to an array of `InteractionInput` objects.
+
+
+
+
+```csharp title="AppHost.cs"
+using Aspire.Hosting.ApplicationModel;
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddProject("myservice")
+ .WithCommand(
+ name: "send-message",
+ displayName: "Send Message",
+ executeCommand: context =>
+ {
+ var text = context.Arguments.GetString("text")!;
+ var repeat = int.TryParse(context.Arguments.GetString("repeat"), out var r) ? r : 1;
+
+ for (var i = 0; i < repeat; i++)
+ {
+ context.Logger.LogInformation("{Text}", text);
+ }
+
+ return Task.FromResult(CommandResults.Success($"Sent '{text}' {repeat} time(s)."));
+ },
+ commandOptions: new CommandOptions
+ {
+ Arguments =
+ [
+ new InteractionInput { Name = "text", Label = "Message", InputType = InputType.Text, Required = true, MaxLength = 200 },
+ new InteractionInput { Name = "repeat", Label = "Repeat", InputType = InputType.Number, Value = "1" },
+ ]
+ });
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import {
+ createBuilder,
+ InputType,
+ type ExecuteCommandContext,
+ type ExecuteCommandResult,
+} from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+await builder
+ .addNodeApp("myservice", "./myservice", "src/server.ts")
+ .withCommand(
+ "send-message",
+ "Send Message",
+ async (context: ExecuteCommandContext): Promise => {
+ const args = await context.arguments();
+ const text = await args.requiredValue("text");
+ const repeat = Number(await args.value("repeat") ?? "1");
+
+ return { success: true, message: `Sent '${text}' ${repeat} time(s).` };
+ },
+ {
+ commandOptions: {
+ arguments: [
+ { name: "text", label: "Message", inputType: InputType.Text, required: true, maxLength: 200 },
+ { name: "repeat", label: "Repeat", inputType: InputType.Number, value: "1" },
+ ]
+ }
+ });
+
+await builder.build().run();
+```
+
+
+
+
+### InteractionInput properties
+
+Each `InteractionInput` object in the `Arguments` array configures one input field in the dashboard prompt and one positional argument for the CLI:
+
+| Property | Type | Description |
+|----------|------|-------------|
+| `Name` / `name` | `string` | Unique identifier used to read the value at runtime. |
+| `Label` / `label` | `string?` / `string \| undefined` | Optional human-readable label shown in the dashboard input dialog. When omitted, the name is used as the label. |
+| `InputType` / `inputType` | `InputType` | Controls the widget type. See the table below. |
+| `Value` / `value` | `string?` | Default value pre-filled in the dialog. |
+| `Required` / `required` | `bool` | When `true`, the built-in validator rejects empty submissions. |
+| `MaxLength` / `maxLength` | `int?` | Optional maximum character length for `Text` and `SecretText` inputs. |
+| `Options` / `options` | `IReadOnlyList>?` / `InteractionInputOption[] \| undefined` | Required for `Choice` inputs. Each option provides the submitted key and display value. |
+
+The `InputType` enum controls how the dashboard renders the field and how built-in validation works:
+
+| Value | Dashboard widget | CLI behavior | Built-in validation |
+|-------|-----------------|--------------|---------------------|
+| `Text` | Single-line text box | Positional string value | `Required`, `MaxLength` |
+| `Number` | Number input | Positional string parsed as number | Must be a valid number |
+| `Boolean` | Checkbox | `true` or `false` string | Must be `true` or `false` |
+| `Choice` | Drop-down list | String must match one of `Options` | Must be a member of `Options` |
+| `SecretText` | Masked text box | Positional string value | `Required`, `MaxLength` |
+
+### Read argument values at runtime
+
+The `ExecuteCommandContext` exposes an `Arguments` property (C#) / `arguments()` method (TypeScript) that returns an `InteractionInputCollection` for reading submitted values.
+
+
+
+
+`InteractionInputCollection` provides typed convenience accessors for common argument reads:
+
+```csharp
+var text = context.Arguments.GetString("text"); // string? — null when absent or empty
+var repeat = context.Arguments.GetInt32("repeat"); // int — throws when absent or unparseable
+var shout = context.Arguments.GetBoolean("shout"); // bool — throws when absent or unparseable
+var amount = context.Arguments.GetDouble("amount"); // double — throws when absent or unparseable
+```
+
+`GetString` returns `null` when the argument is absent or empty. The numeric and boolean accessors throw `InvalidOperationException` when the value is missing and `FormatException` (or `OverflowException` for `GetInt32` and `GetDouble`) when the value can't be parsed. Use `Required = true` on `InteractionInput` to enforce presence before the callback runs, or call `GetString` first and parse the result manually if you need a fallback.
+
+
+
+
+`InteractionInputCollection` (returned by `await context.arguments()`) provides idiomatic async helpers:
+
+```typescript
+const args = await context.arguments();
+
+const all = await args.toArray(); // InteractionInput[]
+const input = await args.required("text"); // InteractionInput (throws if absent)
+const text = await args.value("text"); // string | undefined
+const must = await args.requiredValue("text"); // string (throws if absent or empty)
+```
+
+Use `requiredValue` for arguments declared with `required: true` to get a non-nullable string directly. Use `value` when the argument is optional and you want to handle the absent case yourself.
+
+
+
+
+### Pass arguments from the CLI
+
+When invoking a command from the CLI, supply argument values as ordered positional tokens after the command name. The CLI maps them onto the declared `Arguments` array by position:
+
+```bash title="Terminal"
+aspire resource myservice send-message "Hello world" 3 --apphost MyApp.AppHost.csproj
+```
+
+In the example above, `"Hello world"` maps to the first argument (`text`) and `3` maps to the second (`repeat`).
+
+
+
+## Argument validation
+
+Commands can run server-side validation before the callback executes. Declare a `ValidateArguments` callback on `CommandOptions` to add custom rules on top of the built-in required, max-length, and type checks.
+
+
+
+
+```csharp title="AppHost.cs"
+using Aspire.Hosting.ApplicationModel;
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddProject("myservice")
+ .WithCommand(
+ name: "deploy",
+ displayName: "Deploy",
+ executeCommand: context =>
+ {
+ var target = context.Arguments.GetString("target")!;
+ // ... perform deployment ...
+ return Task.FromResult(CommandResults.Success($"Deployed to {target}."));
+ },
+ commandOptions: new CommandOptions
+ {
+ Arguments =
+ [
+ new InteractionInput { Name = "target", Label = "Target", InputType = InputType.Text, Required = true },
+ ],
+ ValidateArguments = context =>
+ {
+ var target = context.Inputs.GetString("target");
+ if (string.Equals(target, "prod", StringComparison.OrdinalIgnoreCase))
+ {
+ context.AddValidationError("target", "Target must not be 'prod'.");
+ }
+
+ return Task.CompletedTask;
+ }
+ });
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import {
+ createBuilder,
+ InputType,
+ type ExecuteCommandContext,
+ type InputsDialogValidationContext,
+} from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+await builder
+ .addNodeApp("myservice", "./myservice", "src/server.ts")
+ .withCommand(
+ "deploy",
+ "Deploy",
+ async (context: ExecuteCommandContext) => {
+ const args = await context.arguments();
+ const target = await args.requiredValue("target");
+ // ... perform deployment ...
+ return { success: true, message: `Deployed to ${target}.` };
+ },
+ {
+ commandOptions: {
+ arguments: [
+ { name: "target", label: "Target", inputType: InputType.Text, required: true }
+ ],
+ validateArguments: async (context: InputsDialogValidationContext) => {
+ const inputs = await context.inputs();
+ const target = await inputs.value("target");
+
+ if (target?.toLowerCase() === "prod") {
+ await context.addValidationError("target", "Target must not be 'prod'.");
+ }
+ }
+ }
+ });
+
+await builder.build().run();
+```
+
+
+
+
+Built-in validation runs first (required fields, max length, choice membership, and type coercion). If built-in validation passes, the `ValidateArguments` callback runs next. Either kind of validation failure prevents the command callback from executing and returns structured field errors to the caller:
+
+- **Dashboard**: The input dialog stays open with inline field-level error messages.
+- **CLI / MCP**: The command exits with a non-zero status and prints the field errors to stderr.
+
+The `ValidateArguments` context exposes the same `Inputs`/`inputs()` surface as `ExecuteCommandContext.Arguments`/`arguments()`, so the same typed accessors work in both places.
+
+## Command visibility
+
+By default, commands registered with `WithCommand` are visible to both the Aspire dashboard and to API/MCP callers. The `ResourceCommandVisibility` enum is bit-combinable, so you can restrict or expand where a command appears by setting `CommandOptions.Visibility`:
+
+| Value | Where the command is available |
+|-------|-------------------------------|
+| `ResourceCommandVisibility.UI` | Dashboard and other UI clients only |
+| `ResourceCommandVisibility.Api` | API and MCP clients only |
+| `ResourceCommandVisibility.UI \| ResourceCommandVisibility.Api` | Both UI and API/MCP (default) |
+| `ResourceCommandVisibility.None` | Hidden from all clients |
+
+
+
+
+```csharp title="AppHost.cs"
+using Aspire.Hosting.ApplicationModel;
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddProject("myservice")
+ // Only exposed through the API/MCP — not shown in the dashboard
+ .WithCommand(
+ name: "get-metrics",
+ displayName: "Get Metrics",
+ executeCommand: context =>
+ {
+ // ... collect and return metrics ...
+ return Task.FromResult(CommandResults.Success(
+ message: "Metrics collected.",
+ value: new CommandResultData { Value = "{}", Format = CommandResultFormat.Json }));
+ },
+ commandOptions: new CommandOptions
+ {
+ Visibility = ResourceCommandVisibility.Api,
+ });
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import {
+ createBuilder,
+ ResourceCommandVisibility,
+ CommandResultFormat,
+} from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+await builder
+ .addNodeApp("myservice", "./myservice", "src/server.ts")
+ // Only exposed through the API/MCP — not shown in the dashboard
+ .withCommand(
+ "get-metrics",
+ "Get Metrics",
+ async (_context) => {
+ return {
+ success: true,
+ message: "Metrics collected.",
+ data: { value: "{}", format: CommandResultFormat.Json },
+ };
+ },
+ {
+ commandOptions: {
+ visibility: ResourceCommandVisibility.Api,
+ }
+ });
+
+await builder.build().run();
+```
+
+
+
+
+
+
+## Process-backed resource commands
+
+:::caution[Experimental API]
+`WithProcessCommand` is experimental and requires opting in to the [`ASPIREPROCESSCOMMAND001`](/diagnostics/aspireprocesscommand001/) diagnostic suppression. The API shape may change before it stabilizes.
+:::
+
+The `WithProcessCommand` API provides a reusable helper for the common pattern of exposing a local-tool invocation as a resource command. Instead of managing process start, stdout/stderr capture, and cancellation yourself inside a `WithCommand` callback, `WithProcessCommand` does that for you:
+
+- Starts a local process from the AppHost machine using the provided executable path and arguments.
+- Passes arguments as an argument list (not through a shell), so no shell-quoting is needed.
+- Streams stdout and stderr to the command logger (visible in the [Aspire dashboard](/dashboard/explore/#console-logs-page) and via `aspire logs `).
+- Returns the captured output as bounded text (configurable via `MaxOutputLineCount`).
+- Maps non-zero exit codes and cancellation to appropriate `ExecuteCommandResult` values automatically.
+
+:::note
+`WithProcessCommand` runs processes on the **AppHost machine** — not inside a container. Use it for local tools such as `dotnet`, `node`, `docker`, custom CLIs, and scripts.
+:::
+
+### Static process command
+
+The simplest form takes the executable and an argument array directly:
+
+
+
+
+```csharp title="AppHost.cs"
+#pragma warning disable ASPIREPROCESSCOMMAND001
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddRedis("cache")
+ .WithProcessCommand(
+ name: "dotnet-version",
+ displayName: "Show .NET version",
+ executablePath: "dotnet",
+ arguments: ["--version"]);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis("cache");
+
+await cache.withProcessCommand(
+ "node-version",
+ "Show Node.js version",
+ {
+ executablePath: "node",
+ arguments: ["--version"],
+ });
+
+await builder.build().run();
+```
+
+
+
+
+When the command runs in the dashboard or CLI, `dotnet --version` (C#) or `node --version` (TypeScript) executes on the AppHost machine, and the version string is captured and displayed as the command output.
+
+### Dynamic process command
+
+When the command arguments depend on runtime context — for example, a dataset name supplied by the user through the dashboard's argument dialog — build the process specification from the command execution context:
+
+
+
+
+```csharp title="AppHost.cs"
+#pragma warning disable ASPIREPROCESSCOMMAND001
+#pragma warning disable ASPIREINTERACTION001
+
+using Aspire.Hosting.ApplicationModel;
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddRedis("cache")
+ .WithProcessCommand(
+ name: "seed-data",
+ displayName: "Seed data",
+ createProcessSpec: context => new ProcessCommandSpec("dotnet")
+ {
+ Arguments =
+ [
+ "run",
+ "--project",
+ "tools/SeedData",
+ "--",
+ context.Arguments.GetString("dataset") ?? "small",
+ ],
+ EnvironmentVariables = { ["ConnectionStrings__db"] = "Host=localhost;Database=db" },
+ },
+ options: new ProcessCommandOptions
+ {
+ MaxOutputLineCount = 20,
+ Arguments =
+ [
+ new InteractionInput { Name = "dataset", Label = "Dataset", InputType = InputType.Text, Required = true },
+ ],
+ });
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import {
+ createBuilder,
+ type ExecuteCommandContext,
+ InputType,
+} from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis('cache');
+
+await cache.withProcessCommandFactory(
+ 'seed-data',
+ 'Seed data',
+ async (context: ExecuteCommandContext) => {
+ const args = await context.arguments();
+ const dataset = await args.requiredValue('dataset');
+
+ return {
+ executablePath: 'node',
+ arguments: ['./scripts/seed-data.js', '--dataset', dataset],
+ environmentVariables: {
+ NODE_ENV: 'development',
+ },
+ };
+ },
+ {
+ commandOptions: {
+ arguments: [
+ {
+ name: 'dataset',
+ label: 'Dataset',
+ inputType: InputType.Text,
+ required: true,
+ },
+ ],
+ },
+ maxOutputLineCount: 20,
+ }
+);
+
+await builder.build().run();
+```
+
+
+
+
+In C#, the callback overload receives an `ExecuteCommandContext`. In TypeScript, `withProcessCommandFactory` receives the same execution context and returns the process specification. The dashboard renders the configured arguments as a prompt dialog before starting the process, and the entered values are available through the command context.
+
+### `ProcessCommandSpec` properties
+
+The following configuration options are available for the process to run. In C#, these map to `ProcessCommandSpec` properties. In TypeScript, provide them as fields in the options object passed to `withProcessCommand`, or return them from the `withProcessCommandFactory` callback.
+
+- **Executable path** — the path to the process to launch. Short names (no directory separator) are resolved from the AppHost's `PATH`.
+- **Arguments** — a list of arguments passed to the process. Each entry is treated as a separate argument, so no shell quoting or escaping is needed.
+- **Environment variables** — additional key/value pairs set in the child process's environment.
+- **Inherit environment variables** — whether the child process inherits the AppHost process's environment variables. Defaults to `true`.
+- **Standard input content** — optional text written to the process's stdin immediately after it starts.
+- **Working directory** — the directory the process starts in. Defaults to the AppHost directory if not specified.
+- **Kill entire process tree** — whether cancellation and disposal should terminate the whole child process tree. Defaults to `true`.
+
+### `ProcessCommandOptions`
+
+The following options control how `WithProcessCommand` handles the process result. In C#, set them on `ProcessCommandOptions`. In TypeScript, provide them in the same options object as the process configuration for `withProcessCommand`, or in the fourth argument to `withProcessCommandFactory`.
+
+- **Max output line count** — the maximum number of combined stdout/stderr lines captured and returned as the command result. Defaults to 50. Lines beyond this limit are silently discarded (oldest lines first).
+- **Display immediately** — when `true` (the default), the captured output is automatically shown in the dashboard as soon as the command finishes.
+- **Success exit codes** — the list of process exit codes that are treated as a successful command invocation. Defaults to `[0]`.
+
+### Executable path resolution
+
+`WithProcessCommand` resolves the executable using the following rules:
+
+1. If `ExecutablePath` is an absolute path or contains a path separator, it is used as-is.
+2. Otherwise, the AppHost process's `PATH` is searched for the named executable. On Windows, `PATHEXT` extensions are also tried.
+
+This means you can reference tools such as `dotnet`, `node`, or `docker` by short name as long as they are on the AppHost's PATH when the app starts.
diff --git a/src/frontend/src/content/docs/fundamentals/custom-resource-urls.mdx b/src/frontend/src/content/docs/fundamentals/custom-resource-urls.mdx
index bd0873f1c..dc96ec135 100644
--- a/src/frontend/src/content/docs/fundamentals/custom-resource-urls.mdx
+++ b/src/frontend/src/content/docs/fundamentals/custom-resource-urls.mdx
@@ -1,6 +1,7 @@
---
title: Define custom resource URLs
-description: Learn how to create custom URLs for Aspire resources.
+seoTitle: Define custom URLs for Aspire resources in the dashboard
+description: Create custom resource URLs in Aspire so the dashboard, MCP server, and AI coding agents can deep-link to admin tools, health endpoints, and external dashboards.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/fundamentals/external-parameters.mdx b/src/frontend/src/content/docs/fundamentals/external-parameters.mdx
index e829177d4..98eae1133 100644
--- a/src/frontend/src/content/docs/fundamentals/external-parameters.mdx
+++ b/src/frontend/src/content/docs/fundamentals/external-parameters.mdx
@@ -1,6 +1,7 @@
---
title: External parameters
-description: Learn how to express parameters such as secrets, connection strings, and other configuration values that might vary between environments.
+seoTitle: Aspire external parameters and secrets in the AppHost
+description: Express secrets, connection strings, and configuration as Aspire external parameters that flow into resources at run, publish, and deploy time across environments.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -32,18 +33,16 @@ builder.AddProject("api")
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
// Add a parameter named "example-parameter-name"
-const parameter = await builder.addParameter("example-parameter-name");
+const parameter = await builder.addParameter('example-parameter-name');
-await builder.addProject("api", "./ApiService/ApiService.csproj")
- .withEnvironment("ENVIRONMENT_VARIABLE_NAME", parameter);
-
-await builder.build().run();
+const api = await builder.addProject('api', '../ApiService/ApiService.csproj');
+await api.withEnvironment('ENVIRONMENT_VARIABLE_NAME', parameter);
```
@@ -65,12 +64,12 @@ Consider the following AppHost configuration file _appsettings.json_:
}
```
-The preceding JSON configures a parameter in the `Parameters` section of the AppHost configuration. In other words, that AppHost is able to find the parameter as it's configured. For example, you could walk up to the `IDistributedApplicationBuilder.Configuration` and access the value using the `Parameters:example-parameter-name` key:
+The preceding JSON configures a parameter in the `Parameters` section of the AppHost configuration. In other words, that AppHost is able to find the parameter as it's configured. For example, you could access the value using the `Parameters:example-parameter-name` key:
-```csharp
+```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var key = $"Parameters:example-parameter-name";
@@ -80,18 +79,23 @@ var value = builder.Configuration[key]; // value = "local-value"
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-const key = "Parameters:example-parameter-name";
-// Configuration access is handled internally by the Aspire runtime
+const key = 'Parameters:example-parameter-name';
+const value = builder.getConfiguration().getConfigValue(key); // value = "local-value"
```
+
+
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
// Define container registry parameters
-const endpoint = await builder.addParameter("registry-endpoint");
-const repository = await builder.addParameter("registry-repository");
+const endpoint = await builder.addParameter('registry-endpoint');
+const repository = await builder.addParameter('registry-repository');
-await builder.addContainerRegistry("container-registry", endpoint, repository);
+await builder.addContainerRegistry('container-registry', endpoint, repository);
await builder.build().run();
```
@@ -226,29 +230,59 @@ var externalService = builder.AddExternalService("external-service", externalSer
builder.Build().Run();
```
-The code renders this control in the dashboard:
-
-
-
-:::note
-The `withDescription` and `withCustomInput` APIs are not yet available in the TypeScript AppHost SDK.
-:::
+```typescript title="apphost.mts" twoslash
+import { InputType, createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const externalServiceUrl = await builder.addParameter('external-service-url');
+await externalServiceUrl
+ .withDescription(
+ 'The URL of the external service. See [example.com](https://example.com) for details.',
+ { enableMarkdown: true }
+ )
+ .withCustomInput({
+ inputType: InputType.Text,
+ label: 'External service URL',
+ placeholder: 'Enter value for external-service-url',
+ });
+
+await builder.addExternalService('external-service', externalServiceUrl);
+
+await builder.build().run();
+```
+The code renders this control in the dashboard:
+
+
+
-The `Name` property identifies the service, whereas the `Port` and `TargetPort` properties specify the desired and listening ports, respectively.
+The `Name` property identifies the service, whereas the `Port` and `TargetPort` properties specify the desired and listening ports, respectively. `TargetPort` is required for proxyless endpoints, including endpoints with `IsProxied` set to `false` and, starting in Aspire 13.4, endpoints on persistent resources by default.
For network communication, the `Protocol` property supports **TCP** and **UDP**, with potential for more in the future, and the `Transport` property indicates the transport protocol (**HTTP**, **HTTP2**, **HTTP3**). Lastly, if the service is URI-addressable, the `UriScheme` property provides the URI scheme for constructing the service URI.
@@ -269,14 +416,41 @@ For project-resource-specific endpoint filtering, see [Project resources](/integ
By default, every endpoint on a resource is included when another resource references it via `WithReference(resource)`. Some resources expose auxiliary endpoints—such as admin dashboards or health-check ports—that consumer services should not discover automatically. Use the `ExcludeReferenceEndpoint` property on `EndpointAnnotation` to opt an endpoint out of the default reference set:
+
+
+
```csharp title="AppHost.cs"
builder.AddContainer("myservice", "myimage")
.WithHttpEndpoint(name: "management", port: 8080)
.WithEndpoint("management", ep => ep.ExcludeReferenceEndpoint = true);
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const myService = await builder.addContainer('myservice', {
+ image: 'myimage',
+ tag: 'latest',
+});
+await myService.withHttpEndpoint({ name: 'management', port: 8080 });
+await myService.withEndpointCallback('management', async (endpoint) => {
+ endpoint.setExcludeReferenceEndpoint(true);
+});
+```
+
+
+
+
When `ExcludeReferenceEndpoint` is `true`, the endpoint is **not** injected into dependent services by a plain `WithReference(resource)` call. It can still be referenced explicitly by name:
+
+
+
```csharp title="AppHost.cs"
var myService = builder.AddContainer("myservice", "myimage")
.WithHttpEndpoint(name: "api", port: 5000)
@@ -292,13 +466,41 @@ var adminApp = builder.AddProject("admin")
.WithReference(myService.GetEndpoint("management"));
```
+
+
+
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const myService = await builder.addContainer('myservice', {
+ image: 'myimage',
+ tag: 'latest',
+});
+await myService.withHttpEndpoint({ name: 'api', port: 5000 });
+await myService.withHttpEndpoint({ name: 'management', port: 8080 });
+await myService.withEndpointCallback('management', async (endpoint) => {
+ endpoint.setExcludeReferenceEndpoint(true);
+});
+
+const api = await builder.addProject('api', '../Api/Api.csproj');
+await api.withReference(myService);
+
+const adminApp = await builder.addProject('admin', '../Admin/Admin.csproj');
+await adminApp.withReference(myService.getEndpoint('management'));
+```
+
+
+
+
The following built-in Aspire integrations already apply this pattern to their auxiliary endpoints:
-| Resource | Excluded endpoint |
-|---|---|
-| Keycloak | Management dashboard (`management`) |
-| Azure Cosmos DB Emulator | Health-check endpoint (`emulatorHealth`) |
-| Azure Event Hubs Emulator | Health-check endpoint (`emulatorHealth`) |
+| Resource | Excluded endpoint |
+| -------------------------- | ---------------------------------------- |
+| Keycloak | Management dashboard (`management`) |
+| Azure Cosmos DB Emulator | Health-check endpoint (`emulatorHealth`) |
+| Azure Event Hubs Emulator | Health-check endpoint (`emulatorHealth`) |
| Azure Service Bus Emulator | Health-check endpoint (`emulatorHealth`) |
:::note
@@ -312,11 +514,13 @@ The following built-in Aspire integrations already apply this pattern to their a
**Symptom**: Error message like `Address already in use` or `Failed to bind to port`
**Common causes**:
+
- Another instance of your app is still running
- A previous Aspire session didn't shut down cleanly
- Another application is using the same port
**Solutions**:
+
1. Stop any running Aspire sessions with `Ctrl+C` or close the dashboard
2. Check for processes using the port: `netstat -ano | findstr :5000` (Windows) or `lsof -i :5000` (macOS/Linux)
3. Let Aspire assign random ports by removing explicit port numbers from `WithEndpoint`
@@ -326,15 +530,20 @@ The following built-in Aspire integrations already apply this pattern to their a
**Symptom**: Timeouts or connection refused when connecting to a container resource
**Common causes**:
+
- The container hasn't finished starting
- Missing `WaitFor()` dependency
- Container is on the container network but you're connecting from the host
**Solutions**:
+
1. Add `.WaitFor(container)` to ensure the container is ready before dependent services start
2. Add `.WithHttpHealthCheck()` or `.WithHealthCheck()` to the container resource
3. Ensure host services use the **exposed port** (not the container's internal port):
+
+
+
```csharp
// Container exposes port 5432 to host
var db = builder.AddPostgres("db");
@@ -342,14 +551,31 @@ var db = builder.AddPostgres("db");
// Host service connects via exposed port (handled by WithReference)
var api = builder.AddJavaScriptApp("api", "./api")
.WithHttpEndpoint(env: "PORT")
- .WithReference(db); // ✅ Correct - uses exposed port
+ .WithReference(db); // Correct - uses exposed port
```
+
+
+
+```typescript
+// Container exposes port 5432 to host
+const db = await builder.addPostgres('db');
+
+// Host service connects via exposed port (handled by withReference)
+const api = await builder.addJavaScriptApp('api', './api');
+await api.withHttpEndpoint({ env: 'PORT' });
+await api.withReference(db); // Correct - uses exposed port
+```
+
+
+
+
### Service not discoverable
**Symptom**: Service discovery fails with "service not found" or DNS resolution errors
**Solutions**:
+
1. Verify `WithReference()` is set up between producer and consumer
2. Check the endpoint name in the URI matches exactly (case-sensitive)
3. Review [service discovery troubleshooting](/fundamentals/service-discovery/#troubleshooting)
diff --git a/src/frontend/src/content/docs/fundamentals/persist-data-volumes.mdx b/src/frontend/src/content/docs/fundamentals/persist-data-volumes.mdx
index 2737bc5e9..a746ba564 100644
--- a/src/frontend/src/content/docs/fundamentals/persist-data-volumes.mdx
+++ b/src/frontend/src/content/docs/fundamentals/persist-data-volumes.mdx
@@ -1,6 +1,6 @@
---
-title: Persist Aspire project data using volumes or bind mounts
-description: Learn about Aspire configurations that persist data across restarts by using volumes and bind mounts in containers.
+title: Persist Aspire data with volumes and binds
+description: Configure Aspire resources to persist data across restarts using container volumes and bind mounts for databases, caches, message brokers, and stateful integrations.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -59,8 +59,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -88,7 +88,7 @@ var sql = builder.AddSqlServer("sql")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sql = await builder.addSqlServer("sql");
await sql.withVolume("/var/opt/mssql");
const sqldb = await sql.addDatabase("sqldb");
@@ -113,7 +113,7 @@ var sql = builder.AddSqlServer("sql")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sql = await builder.addSqlServer("sql");
await sql.withDataVolume();
const sqldb = await sql.addDatabase("sqldb");
@@ -148,7 +148,7 @@ var sql = builder.AddSqlServer("sql")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sql = await builder.addSqlServer("sql");
await sql.withBindMount("C:\\SqlServer\\Data", "/var/opt/mssql");
const sqldb = await sql.addDatabase("sqldb");
@@ -176,7 +176,7 @@ var sql = builder.AddSqlServer("sql")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sql = await builder.addSqlServer("sql");
await sql.withDataBindMount("C:\\SqlServer\\Data");
const sqldb = await sql.addDatabase("sqldb");
@@ -201,7 +201,7 @@ var sql = builder.AddSqlServer("sql")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sql = await builder.addSqlServer("sql");
await sql.withDataVolume();
const sqldb = await sql.addDatabase("sqldb");
@@ -253,7 +253,7 @@ var sql = builder.AddSqlServer("sql", password: sqlPassword)
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const sqlPassword = await builder.addParameter("sql-password", { secret: true });
const sql = await builder.addSqlServer("sql", { password: sqlPassword });
diff --git a/src/frontend/src/content/docs/fundamentals/service-discovery.mdx b/src/frontend/src/content/docs/fundamentals/service-discovery.mdx
index 98bdc30fb..6bf5e0a9a 100644
--- a/src/frontend/src/content/docs/fundamentals/service-discovery.mdx
+++ b/src/frontend/src/content/docs/fundamentals/service-discovery.mdx
@@ -1,6 +1,7 @@
---
title: Service discovery
-description: Understand essential service discovery concepts in Aspire.
+seoTitle: Aspire service discovery essentials for distributed apps
+description: Understand essential Aspire service discovery concepts — endpoints, URIs, HttpClient resolution, and how service references flow from the AppHost into your app code.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -19,7 +20,10 @@ When you connect services using `WithReference()`, Aspire sets up automatic serv
**The key insight**: Your code uses logical service names (like `catalog`), and Aspire's configuration-based endpoint resolver translates those to actual addresses at runtime.
## Implicit service discovery by reference
@@ -29,31 +33,40 @@ Configuration for service discovery is only added for services that are referenc
-```csharp title="C# — AppHost.cs"
+```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var catalog = builder.AddProject("catalog");
var basket = builder.AddProject("basket");
var frontend = builder.AddProject("frontend")
- .WithReference(basket)
- .WithReference(catalog);
+ .WithReference(basket)
+ .WithReference(catalog);
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-const catalog = await builder.addProject("catalog", "./CatalogService/CatalogService.csproj");
-const basket = await builder.addProject("basket", "./BasketService/BasketService.csproj");
-
-const frontend = await builder.addProject("frontend", "./MyFrontend/MyFrontend.csproj")
- .withReference(basket)
- .withReference(catalog);
+const catalog = await builder.addProject(
+ 'catalog',
+ '../CatalogService/CatalogService.csproj'
+);
+const basket = await builder.addProject(
+ 'basket',
+ '../BasketService/BasketService.csproj'
+);
+
+const frontend = await builder.addProject(
+ 'frontend',
+ '../MyFrontend/MyFrontend.csproj'
+);
+await frontend.withReference(basket);
+await frontend.withReference(catalog);
await builder.build().run();
```
@@ -67,7 +80,9 @@ In the preceding example, the _frontend_ project references the _catalog_ projec
2. **Enable resolution** - Allow `frontend` to use URIs like `https+http://catalog` in HttpClient
## Named endpoints
@@ -172,12 +187,12 @@ In the preceding JSON:
### Named endpoints in Aspire
-Named endpoints can also be exposed by code in the App Host. For instance the previous example can be modeled as:
+Named endpoints can also be exposed by code in the AppHost. For instance, the previous example can be modeled as:
-```csharp
+```csharp title="AppHost.cs"
var basket = builder.AddProject("basket")
.WithHttpsEndpoint(port: 9999, name: "dashboard");
```
@@ -185,9 +200,12 @@ var basket = builder.AddProject("basket")
-```typescript title="TypeScript — apphost.ts"
-const basket = await builder.addProject("basket", "./BasketService/BasketService.csproj")
- .withHttpsEndpoint({ port: 9999, name: "dashboard" });
+```typescript title="apphost.mts"
+const basket = await builder.addProject(
+ 'basket',
+ '../BasketService/BasketService.csproj'
+);
+await basket.withHttpsEndpoint({ port: 9999, name: 'dashboard' });
```
@@ -341,6 +359,7 @@ const response = await fetch(`${dashboardUrl}/api/stats`);
**Symptoms**: HttpClient throws an exception like "No endpoints resolved for service 'myservice'" or connection is refused.
**Common causes**:
+
1. **Missing `WithReference()`** - The calling service wasn't connected to the target service in AppHost
2. **Wrong service name** - The name in your URI doesn't match the name in `AddProject()` or `AddContainer()`
3. **Service not started** - The target service failed to start or is still starting
@@ -353,16 +372,19 @@ const response = await fetch(`${dashboardUrl}/api/stats`);
```csharp
var api = builder.AddProject("api");
var frontend = builder.AddProject("frontend")
- .WithReference(api); // ← This is required!
+ .WithReference(api); // This is required!
```
-```typescript title="TypeScript — apphost.ts"
-const api = await builder.addProject("api", "./Api/Api.csproj");
-const frontend = await builder.addProject("frontend", "./Frontend/Frontend.csproj")
- .withReference(api); // ← This is required!
+```typescript title="apphost.mts"
+const api = await builder.addProject('api', '../Api/Api.csproj');
+const frontend = await builder.addProject(
+ 'frontend',
+ '../Frontend/Frontend.csproj'
+);
+await frontend.withReference(api); // This is required!
```
@@ -379,15 +401,15 @@ const frontend = await builder.addProject("frontend", "./Frontend/Frontend.cspro
```csharp
var api = builder.AddProject("api")
- .WithHttpEndpoint(port: 9999, name: "dashboard"); // ← Name must match
+ .WithHttpEndpoint(port: 9999, name: "dashboard"); // Name must match
```
-```typescript title="TypeScript — apphost.ts"
-const api = await builder.addProject("api", "./Api/Api.csproj")
- .withHttpEndpoint({ port: 9999, name: "dashboard" }); // ← Name must match
+```typescript title="apphost.mts"
+const api = await builder.addProject('api', '../Api/Api.csproj');
+await api.withHttpEndpoint({ port: 9999, name: 'dashboard' }); // Name must match
```
@@ -430,13 +452,15 @@ const dashboardUrl = process.env.services__api__dashboard__0;
The `https+http://` prefix means "prefer HTTPS, fall back to HTTP". Here's the breakdown:
-| URI Format | Meaning |
-|------------|---------|
-| `https://catalog` | HTTPS only to default endpoint |
-| `http://catalog` | HTTP only to default endpoint |
-| `https+http://catalog` | Prefer HTTPS, fall back to HTTP |
+| URI Format | Meaning |
+| ------------------------ | ------------------------------- |
+| `https://catalog` | HTTPS only to default endpoint |
+| `http://catalog` | HTTP only to default endpoint |
+| `https+http://catalog` | Prefer HTTPS, fall back to HTTP |
| `https://_admin.catalog` | HTTPS to named "admin" endpoint |
diff --git a/src/frontend/src/content/docs/fundamentals/telemetry.mdx b/src/frontend/src/content/docs/fundamentals/telemetry.mdx
index bb57e51da..b22c31746 100644
--- a/src/frontend/src/content/docs/fundamentals/telemetry.mdx
+++ b/src/frontend/src/content/docs/fundamentals/telemetry.mdx
@@ -1,6 +1,7 @@
---
title: Telemetry
-description: Learn about essential telemetry concepts for Aspire including logging, tracing, and metrics.
+seoTitle: 'Aspire telemetry: OpenTelemetry logs, traces, and metrics'
+description: Learn the essential Aspire telemetry concepts — logging, distributed tracing, and metrics with OpenTelemetry, and how the Aspire dashboard surfaces them in real time.
---
diff --git a/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx b/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx
index 562d3257d..0e408e41a 100644
--- a/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx
+++ b/src/frontend/src/content/docs/get-started/add-aspire-existing-app.mdx
@@ -1,6 +1,6 @@
---
-title: "Add Aspire to an existing app"
-description: "Add Aspire to an existing application using aspire init and an AI coding agent, or by manually wiring resources in your AppHost."
+title: Add Aspire to an existing app
+description: Add Aspire to an existing application — use aspire init with an AI coding agent or wire up the AppHost manually to bring your services into the Aspire resource model.
next: false
---
@@ -35,8 +35,8 @@ Before you begin, make sure you have:
-- [Node.js 22 or later](https://nodejs.org/)
-- npm, yarn, or pnpm
+- [Node.js 22.x or 24.x LTS](https://nodejs.org/)
+- A [supported AppHost-root package manager](/app-host/typescript-apphost/#package-managers): npm, pnpm, Yarn 4+, or Bun
@@ -53,7 +53,7 @@ The fastest way to add Aspire to an existing app is to let `aspire init` scaffol
aspire init
```
- Choose your AppHost language (C# or TypeScript) when prompted, or pass `--language csharp` / `--language typescript`. The command creates a minimal AppHost file, an `aspire.config.json`, and installs the `aspireify` skill into your agent's skill directory.
+ Choose your AppHost language (C# or TypeScript) when prompted, or pass `--language csharp` / `--language typescript`. The command creates a minimal AppHost, an `aspire.config.json`, and installs the `aspireify` skill into your agent's skill directory. For existing JavaScript or TypeScript apps with a root `package.json`, the TypeScript AppHost is created in an `aspire-apphost/` subfolder so Aspire doesn't change the existing app package's module settings.
:::note[The AppHost language doesn't limit what you can orchestrate]
Whether you choose a C# or TypeScript AppHost, Aspire can orchestrate services written in any language — C#, JavaScript, Python, Go, Rust, Java, containers, and more. The AppHost language is just how you express the orchestration, not a constraint on the workloads.
@@ -106,8 +106,8 @@ Both styles use the same `Aspire.AppHost.Sdk` and the same hosting APIs.
Use a TypeScript AppHost when your repo already centers on a Node.js workspace or when you prefer path-based orchestration in TypeScript.
-- Lives in `apphost.ts`
-- Runs under popular package managers including npm, pnpm, yarn, and Bun
+- Lives in `apphost.mts`; for existing JavaScript and TypeScript apps, `aspire init` creates it under `aspire-apphost/`
+- Runs under supported package managers including npm, pnpm, Yarn 4+, and Bun
- Fits naturally into existing package-manager and monorepo workflows
@@ -282,10 +282,10 @@ For the full `AddProject` workflow including custom type names, multi-project so
aspire add postgres
```
-3. Wire the resources in `apphost.ts`:
+3. Wire the resources in `aspire-apphost/apphost.mts`:
- ```typescript title="apphost.ts" twoslash
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="apphost.mts" twoslash
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -294,13 +294,13 @@ For the full `AddProject` workflow including custom type names, multi-project so
const db = (await builder.addPostgres('postgres')).addDatabase('mydb');
const api = await builder
- .addProject('api', './src/Api/MyApp.Api.csproj')
+ .addProject('api', '../src/Api/MyApp.Api.csproj')
.withReference(db)
.withReference(cache)
.waitFor(db);
await builder
- .addViteApp('web', './services/web')
+ .addViteApp('web', '../services/web')
.withReference(api)
.waitFor(api);
@@ -312,10 +312,13 @@ For the full `AddProject` workflow including custom type names, multi-project so
After setup, a typical workspace layout looks like this:
- - apphost.ts (new)
- - .modules/ (new)
- aspire.config.json (new)
- - package.json (new or updated)
+ - package.json (updated with Aspire delegate scripts)
+ - aspire-apphost/ (new)
+ - apphost.mts
+ - .aspire/modules/
+ - package.json
+ - tsconfig.apphost.json
- services/
- web/
- package.json
@@ -325,8 +328,8 @@ After setup, a typical workspace layout looks like this:
- MyApp.Api.csproj
-:::note[The .modules folder is generated]
-Let the Aspire CLI manage `.modules/` rather than editing generated SDK files manually.
+:::note[The .aspire folder is generated]
+Let the Aspire CLI manage `aspire-apphost/.aspire/` rather than editing generated SDK files manually. Run `aspire restore` to regenerate the TypeScript SDK after switching branches or changing AppHost packages.
:::
@@ -369,25 +372,25 @@ builder.Build().Run();
-```typescript title="apphost.ts — Existing services with hosting integrations" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts — Existing services with hosting integrations" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const cache = await builder.addRedis('cache');
const api = await builder
- .addUvicornApp('api', './services/api', 'main:app')
+ .addUvicornApp('api', '../services/api', 'main:app')
.withUv()
.withReference(cache)
.withExternalHttpEndpoints();
await builder
- .addPythonApp('worker', './workers/inventory-sync', 'worker.py')
+ .addPythonApp('worker', '../workers/inventory-sync', 'worker.py')
.withReference(cache);
await builder
- .addViteApp('web', './services/web')
+ .addViteApp('web', '../services/web')
.withReference(api)
.waitFor(api);
@@ -448,8 +451,8 @@ builder.Build().Run();
-```typescript title="apphost.ts — Existing containers and shared infrastructure" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts — Existing containers and shared infrastructure" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -535,20 +538,20 @@ builder.Build().Run();
-```typescript title="apphost.ts" showLineNumbers twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" showLineNumbers twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const db = (await builder.addPostgres('postgres')).addDatabase('mydb');
const api = await builder
- .addDockerfile('api', './api')
+ .addDockerfile('api', '../api')
.withReference(db)
.withHttpEndpoint({ port: 8080, targetPort: 8080, name: 'http' });
await builder
- .addDockerfile('web', './web')
+ .addDockerfile('web', '../web')
.withReference(api)
.withHttpEndpoint({ port: 3000, targetPort: 3000, name: 'http' });
diff --git a/src/frontend/src/content/docs/get-started/ai-coding-agents.mdx b/src/frontend/src/content/docs/get-started/ai-coding-agents.mdx
index 28ae0cb1b..357d421bd 100644
--- a/src/frontend/src/content/docs/get-started/ai-coding-agents.mdx
+++ b/src/frontend/src/content/docs/get-started/ai-coding-agents.mdx
@@ -1,6 +1,7 @@
---
title: Use AI coding agents
-description: Set up your AI coding agents with skills, MCP servers, and browser automation tailored to Aspire.
+seoTitle: Use AI coding agents with Aspire AppHost projects today
+description: Set up AI coding agents to work with Aspire — install skills, configure the Aspire MCP server, and enable browser automation for distributed-app development workflows.
---
import { LinkCard, CardGrid } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/get-started/app-host.mdx b/src/frontend/src/content/docs/get-started/app-host.mdx
index f342579e6..e9202c9af 100644
--- a/src/frontend/src/content/docs/get-started/app-host.mdx
+++ b/src/frontend/src/content/docs/get-started/app-host.mdx
@@ -1,6 +1,7 @@
---
title: What is the AppHost?
-description: Learn how to define your application's architecture using Aspire's AppHost.
+seoTitle: What is the Aspire AppHost? Introduction and concepts
+description: "Learn how the Aspire AppHost defines your application's architecture — services, containers, executables, and integrations, modeled with C# or TypeScript code."
lastUpdated: true
---
@@ -109,7 +110,7 @@ architecture-beta
This architecture demonstrates a **Go API** connecting to a **PostgreSQL database**, with a **React frontend** consuming the API. The Go API uses the standard library's `net/http` package or frameworks like Gin or Echo and connects to PostgreSQL using libraries like pgx or database/sql. The React frontend is built with Vite and communicates with the API over HTTP.
@@ -722,11 +723,11 @@ The template AppHost is structured in the following ways:
- **my-apphost/**
- - .modules/ Generated SDK
- - apphost.ts dev-time orchestrator
+ - .aspire/modules/ Generated SDK
+ - apphost.mts dev-time orchestrator
- aspire.config.json
- package.json
- - tsconfig.json
+ - tsconfig.apphost.json
diff --git a/src/frontend/src/content/docs/get-started/aspire-mcp-server.mdx b/src/frontend/src/content/docs/get-started/aspire-mcp-server.mdx
index 42b4adb33..7613e0c94 100644
--- a/src/frontend/src/content/docs/get-started/aspire-mcp-server.mdx
+++ b/src/frontend/src/content/docs/get-started/aspire-mcp-server.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire MCP server
-description: Learn about the Aspire MCP server tools, security model, and troubleshooting for AI coding agents.
+title: Aspire MCP server for AI coding agents
+description: Learn how the Aspire MCP server exposes resource graphs, logs, and telemetry to AI coding agents — security model, transport options, and troubleshooting tips.
---
import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -139,8 +139,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -231,8 +231,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/get-started/aspire-sdk-templates.mdx b/src/frontend/src/content/docs/get-started/aspire-sdk-templates.mdx
index e8fe2c63e..df3e20444 100644
--- a/src/frontend/src/content/docs/get-started/aspire-sdk-templates.mdx
+++ b/src/frontend/src/content/docs/get-started/aspire-sdk-templates.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire templates
-description: Learn about the Aspire templates and how to use them to create new apps.
+title: Aspire SDK templates for new apps
+description: "Learn about the Aspire SDK templates — Starter app, AppHost, ServiceDefaults — and how to use them to scaffold new C# or TypeScript Aspire applications quickly."
---
import { Image } from 'astro:assets';
@@ -40,7 +40,7 @@ The following Aspire solution templates are available (assume the solution is na
- **AspireSample.Web**: A React-based frontend application with TypeScript configured to work with the Aspire app.
- **Aspire Starter App with FastAPI and React**: This template provides a Python-based starter app using a **TypeScript AppHost**. It includes:
- - **apphost.ts**: The TypeScript AppHost that orchestrates the app's services using `addUvicornApp`.
+ - **apphost.mts**: The TypeScript AppHost that orchestrates the app's services using `addUvicornApp`.
- **app/**: A [FastAPI](https://fastapi.tiangolo.com/) Python backend service that provides data to the frontend.
- **frontend/**: A React-based frontend application with TypeScript.
diff --git a/src/frontend/src/content/docs/get-started/aspire-sdk.mdx b/src/frontend/src/content/docs/get-started/aspire-sdk.mdx
index f654ac15e..0f877b825 100644
--- a/src/frontend/src/content/docs/get-started/aspire-sdk.mdx
+++ b/src/frontend/src/content/docs/get-started/aspire-sdk.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire SDK
-description: Learn about the Aspire SDK and how it simplifies orchestrating Aspire applications.
+title: Aspire SDK for distributed apps
+description: Learn how the Aspire SDK simplifies orchestrating Aspire applications — packaging, project references, source generators, and how the SDK plugs into AppHost projects.
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
@@ -94,6 +94,55 @@ var microservice2 = builder.AddProject("micro2");
### Orchestrator dependencies
-The Aspire SDK dynamically adds references to the [Aspire dashboard](/dashboard/overview/) and other AppHost dependencies, such as the developer control plane (DCP) packages. These dependencies are specific to the platform that the AppHost is built on.
+The Aspire SDK dynamically adds references to the [Aspire Dashboard](/dashboard/overview/) and other AppHost dependencies, such as the developer control plane (DCP) packages. These dependencies are specific to the platform that the AppHost is built on.
When the AppHost project runs, the orchestrator relies on these dependencies to provide the necessary functionality to the AppHost. For more information, see [Aspire orchestration overview](/get-started/app-host/).
+
+### Use the Aspire CLI bundle for orchestration dependencies
+
+:::caution[Preview feature]
+`AspireUseCliBundle` is a preview opt-in that smooths the transition to CLI-bundle-based orchestration dependencies before they become the default.
+:::
+
+Today, the Aspire SDK restores the binaries for these dependencies from platform-specific NuGet packages, so the versions that run with your AppHost are tied to package restore.
+
+Aspire is moving toward using the installed **Aspire CLI bundle** as the source for those orchestration dependencies. With this model, those binaries update when you update the Aspire CLI through [`aspire update --self`](/reference/cli/commands/aspire-update/) instead of being tied to RID-specific `Aspire.Hosting.Orchestration.*` and `Aspire.Dashboard.Sdk.*` package references in each AppHost project.
+
+Set `AspireUseCliBundle` to `true` to opt in during the transition before this behavior becomes the default.
+
+When `AspireUseCliBundle` is `true`:
+
+- `Aspire.AppHost.Sdk` still sets AppHost properties and adds the implicit `Aspire.Hosting.AppHost` package.
+- Your AppHost uses the DCP and Dashboard versions installed with the Aspire CLI.
+- At build time, the SDK resolves the DCP and Dashboard executables in this priority order:
+ 1. Explicit `AspireCliBundlePath` / `AspireCliPath` properties in the project file.
+ 2. The `aspire` executable on `PATH`.
+- If the bundle cannot be found, the build emits error `ASPIRE009` with a message directing you to [get.aspire.dev](https://get.aspire.dev) to install the Aspire CLI.
+
+#### Enable the opt-in
+
+Set `AspireUseCliBundle` in your AppHost `.csproj`:
+
+```xml title="MyApp.AppHost.csproj"
+
+ true
+
+```
+
+:::note[Advanced scenario: Override the bundle path]
+Most apps don't need to set the CLI bundle path. If the Aspire CLI isn't on `PATH`, provide an explicit path using `AspireCliBundlePath` (path to the CLI bundle directory) or `AspireCliPath` (path to the `aspire` executable):
+
+```xml title="MyApp.AppHost.csproj"
+
+ true
+
+ /usr/local/bin/aspire
+
+
+
+```
+:::
+
+#### Running with aspire run or aspire start
+
+When you start an opted-in AppHost using `aspire run` or `aspire start`, the CLI automatically passes the resolved bundle paths through the `ASPIRE_DCP_PATH` and `ASPIRE_DASHBOARD_PATH` environment variables.
diff --git a/src/frontend/src/content/docs/get-started/aspire-vscode-extension.mdx b/src/frontend/src/content/docs/get-started/aspire-vscode-extension.mdx
index c5e49e0f2..bf3d9a597 100644
--- a/src/frontend/src/content/docs/get-started/aspire-vscode-extension.mdx
+++ b/src/frontend/src/content/docs/get-started/aspire-vscode-extension.mdx
@@ -1,6 +1,6 @@
---
title: Aspire Visual Studio Code extension
-description: Learn how to use the Aspire Visual Studio Code extension to create, configure, run, and deploy Aspire solutions.
+description: Use the Aspire Visual Studio Code extension to create, configure, run, and deploy Aspire applications — with integrated CLI, dashboards, and AI-assisted workflows.
---
import { Steps } from '@astrojs/starlight/components';
@@ -49,7 +49,7 @@ A recent version of [Visual Studio Code](https://code.visualstudio.com/) and the
The Aspire: New Aspire project command, showing starter templates for Blazor, React + C#, Express + TypeScript, FastAPI + TypeScript, and an empty AppHost.
-The extension discovers your AppHost from `aspire.config.json`, so both project-based C# AppHosts (`*.csproj`) and TypeScript AppHosts (`apphost.ts`) work without extra configuration.
+The extension discovers your AppHost from `aspire.config.json`, so both project-based C# AppHosts (`*.csproj`) and TypeScript AppHosts (`apphost.mts`) work without extra configuration.
:::tip[Prefer a guided tour?]
**Help > Get Started > Get started with Aspire** opens a built-in walkthrough covering CLI install, project creation, running, and exploring the dashboard — all without leaving VS Code.
diff --git a/src/frontend/src/content/docs/get-started/csharp-service-defaults.mdx b/src/frontend/src/content/docs/get-started/csharp-service-defaults.mdx
index 32bfca14f..2de39c413 100644
--- a/src/frontend/src/content/docs/get-started/csharp-service-defaults.mdx
+++ b/src/frontend/src/content/docs/get-started/csharp-service-defaults.mdx
@@ -1,6 +1,7 @@
---
-title: C# Service Defaults
-description: Learn about the Aspire Service Defaults project for C# apps.
+title: 'C# Service Defaults'
+seoTitle: 'Aspire C# ServiceDefaults project: OTel and resilience'
+description: "Learn how the Aspire ServiceDefaults project for C# apps wires up OpenTelemetry, health checks, service discovery, and resilience defaults across your services."
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/get-started/deploy-first-app.mdx b/src/frontend/src/content/docs/get-started/deploy-first-app.mdx
index 8953f825f..a33430eec 100644
--- a/src/frontend/src/content/docs/get-started/deploy-first-app.mdx
+++ b/src/frontend/src/content/docs/get-started/deploy-first-app.mdx
@@ -1,6 +1,6 @@
---
title: Deploy your first Aspire app
-description: Learn how to deploy your first Aspire application with either a C# or TypeScript AppHost.
+description: "Deploy your first Aspire application end to end — choose a target (Azure, Kubernetes, or Docker Compose), publish artifacts, and run `aspire deploy` from a C# or TypeScript AppHost."
---
import { Aside, FileTree, Steps, TabItem, Tabs } from '@astrojs/starlight/components';
@@ -307,8 +307,8 @@ In the AppHost, chain a call to the appropriate environment API method to config
- ```typescript title="TypeScript — apphost.ts" {5-6} twoslash
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="TypeScript — apphost.mts" {5-6} twoslash
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -336,8 +336,8 @@ In the AppHost, chain a call to the appropriate environment API method to config
- ```typescript title="TypeScript — apphost.ts" {5-6} twoslash
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="TypeScript — apphost.mts" {5-6} twoslash
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/get-started/dev-containers.mdx b/src/frontend/src/content/docs/get-started/dev-containers.mdx
index 319b9318f..354bdaa13 100644
--- a/src/frontend/src/content/docs/get-started/dev-containers.mdx
+++ b/src/frontend/src/content/docs/get-started/dev-containers.mdx
@@ -1,6 +1,7 @@
---
title: Dev Containers in Visual Studio Code
-description: Learn how to use Aspire with Dev Containers in Visual Studio Code for containerized development environments.
+seoTitle: Aspire dev containers for Visual Studio Code overview
+description: Use Aspire with Dev Containers in Visual Studio Code to get reproducible, containerized development environments with the Aspire CLI, dashboard, and tooling preinstalled.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/get-started/faq.mdx b/src/frontend/src/content/docs/get-started/faq.mdx
index 172152f5e..8ecd2840b 100644
--- a/src/frontend/src/content/docs/get-started/faq.mdx
+++ b/src/frontend/src/content/docs/get-started/faq.mdx
@@ -1,6 +1,7 @@
---
title: Frequently asked questions (FAQ)
-description: Answers to common questions about Aspire, including the AppHost, dashboard, integrations, TypeScript support, deployment, and how Aspire compares to other tools.
+seoTitle: 'Aspire FAQ: common questions and answers for developers'
+description: Answers to common questions about Aspire — the AppHost, dashboard, integrations, TypeScript support, deployment targets, telemetry, and licensing for production apps.
---
This page answers common questions about what Aspire is, how it fits into your workflow, what it can do for you, and how it compares to other technologies.
@@ -63,13 +64,13 @@ Learn more: [What is the AppHost?](/get-started/app-host/), [Deployment overview
**No.** .NET is an especially strong experience in Aspire, but the app model is broader than one framework or runtime. Aspire is designed to coordinate services across multiple stacks, and the TypeScript AppHost makes it a natural fit for existing JavaScript and TypeScript applications as well.
-Learn more: [TypeScript AppHost support](/whats-new/aspire-13-2/#-typescript-apphost-support-preview)
+Learn more: [TypeScript AppHost project structure](/app-host/typescript-apphost/)
## Can I write the AppHost in TypeScript?
-**Yes.** A TypeScript AppHost (`apphost.ts`) is a first-class option for existing JavaScript and TypeScript applications. That experience uses commands such as `aspire init --language typescript` and AppHost APIs such as `addNodeApp`, `addViteApp`, and `addJavaScriptApp`.
+**Yes.** A TypeScript AppHost (`apphost.mts`) is a first-class option for existing JavaScript and TypeScript applications. That experience uses commands such as `aspire init --language typescript` and AppHost APIs such as `addNodeApp`, `addViteApp`, and `addJavaScriptApp`.
-Learn more: [`aspire init`](/reference/cli/commands/aspire-init/), [TypeScript AppHost support](/whats-new/aspire-13-2/#-typescript-apphost-support-preview)
+Learn more: [`aspire init`](/reference/cli/commands/aspire-init/), [TypeScript AppHost project structure](/app-host/typescript-apphost/)
## Is Aspire only for brand-new projects?
diff --git a/src/frontend/src/content/docs/get-started/first-app.mdx b/src/frontend/src/content/docs/get-started/first-app.mdx
index a76c5eb18..cf1fb8333 100644
--- a/src/frontend/src/content/docs/get-started/first-app.mdx
+++ b/src/frontend/src/content/docs/get-started/first-app.mdx
@@ -1,6 +1,6 @@
---
-title: "Build your first Aspire app"
-description: "Build your first Aspire app with either a C# or TypeScript AppHost."
+title: Build your first Aspire app
+description: "Build your first Aspire app from scratch with either a C# or TypeScript AppHost — add resources, run the dashboard, and explore telemetry in a few minutes."
prev: false
---
@@ -46,7 +46,7 @@ architecture-beta
-This quickstart uses the JavaScript starter template, which generates a TypeScript AppHost in `apphost.ts`. You'll create the solution, review the generated TypeScript AppHost, and run it locally with Aspire.
+This quickstart uses the JavaScript starter template, which generates a TypeScript AppHost in `apphost.mts`. You'll create the solution, review the generated TypeScript AppHost, and run it locally with Aspire.
This starter template combines a modern JavaScript stack:
@@ -233,9 +233,12 @@ To create your first Aspire application, use the [Aspire CLI](/get-started/insta
- package.json
- tsconfig.json
- vite.config.ts
- - **apphost.ts** dev-time orchestrator
+ - **apphost.mts** dev-time orchestrator
+ - .aspire/
+ - modules/ generated TypeScript SDK
- aspire.config.json
- package.json
+ - tsconfig.apphost.json
This solution structure is based on the Aspire templates. If they're not installed already, the CLI will install them for you.
@@ -244,8 +247,8 @@ To create your first Aspire application, use the [Aspire CLI](/get-started/insta
The [AppHost](/get-started/app-host/) is the heart of your Aspire application. It defines which services run, how they connect, and in what order they start. Let's look at the generated code:
- ```typescript title="TypeScript — apphost.ts" twoslash
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="TypeScript — apphost.mts" twoslash
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -373,9 +376,9 @@ To create your first Aspire application, use the [Aspire CLI](/get-started/insta
```bash title="Example output" mark={6}
🔍 Finding apphosts...
- apphost.ts
+ apphost.mts
- AppHost: apphost.ts
+ AppHost: apphost.mts
Dashboard: https://localhost:17174/login?t=afb274c630f48b1c4ddfe139011c1cb7
diff --git a/src/frontend/src/content/docs/get-started/github-codespaces.mdx b/src/frontend/src/content/docs/get-started/github-codespaces.mdx
index 5c23cfbe5..6cc0ee933 100644
--- a/src/frontend/src/content/docs/get-started/github-codespaces.mdx
+++ b/src/frontend/src/content/docs/get-started/github-codespaces.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire and GitHub Codespaces
-description: Learn how to use Aspire with GitHub Codespaces for cloud-based development.
+title: Use Aspire with GitHub Codespaces
+description: Use Aspire with GitHub Codespaces for cloud-based development — preconfigured containers, port forwarding, dashboard access, and a ready-to-go Aspire CLI experience.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/get-started/glossary.mdx b/src/frontend/src/content/docs/get-started/glossary.mdx
index e1989cf27..821451e99 100644
--- a/src/frontend/src/content/docs/get-started/glossary.mdx
+++ b/src/frontend/src/content/docs/get-started/glossary.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire glossary
-description: Key terms and concepts used throughout Aspire documentation, including AppHost, resources, service discovery, and orchestration terminology.
+title: Aspire glossary of terms and concepts
+description: Key terms and concepts used throughout Aspire documentation — AppHost, resources, service discovery, integrations, dashboard, deployment, and orchestration primitives.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/get-started/install-cli.mdx b/src/frontend/src/content/docs/get-started/install-cli.mdx
index c6ec287a4..c641c41ed 100644
--- a/src/frontend/src/content/docs/get-started/install-cli.mdx
+++ b/src/frontend/src/content/docs/get-started/install-cli.mdx
@@ -1,5 +1,6 @@
---
title: Install Aspire CLI
+seoTitle: 'Install Aspire CLI: native executable or .NET tool'
description: Learn how to install the Aspire CLI as a native executable or .NET global tool to manage your cloud-native applications.
lastUpdated: true
tableOfContents: true
diff --git a/src/frontend/src/content/docs/get-started/prerequisites.mdx b/src/frontend/src/content/docs/get-started/prerequisites.mdx
index ceafcc7fe..ce6475219 100644
--- a/src/frontend/src/content/docs/get-started/prerequisites.mdx
+++ b/src/frontend/src/content/docs/get-started/prerequisites.mdx
@@ -1,6 +1,7 @@
---
title: Prerequisites
-description: Learn about essential tooling concepts for Aspire.
+seoTitle: Aspire prerequisites and required tooling for your setup
+description: Install the prerequisites for Aspire development — .NET SDK, container runtime, IDE extensions, and the Aspire CLI, with platform-specific guidance for every target.
giscus: false
tableOfContents:
minHeadingLevel: 1
@@ -32,7 +33,7 @@ Ready to dive into Aspire? Before you begin, make sure your development environm
- Aspire's TypeScript AppHost requires [Node.js](https://nodejs.org/) 20 or later (LTS recommended) and a compatible package manager. The following package managers are supported: **npm** (included with Node.js), **pnpm**, **Yarn**, and **Bun**. The Aspire CLI auto-detects the active toolchain from your `package.json` `packageManager` field or from lockfiles in your project directory or parent directories.
+ Aspire's TypeScript AppHost requires a supported [Node.js](https://nodejs.org/) LTS release: **22.x or 24.x** — the engine range that `aspire init` writes into the scaffolded `package.json` (`"engines": { "node": "^22.13.0 || ^24.0.0" }`). It also requires a [supported AppHost-root package manager](/app-host/typescript-apphost/#package-managers): **npm** (default, included with Node.js), **pnpm**, **Yarn 4+** (Berry), or **Bun**. **Yarn Classic (v1) is not supported.** The Aspire CLI auto-detects the active toolchain from your `package.json` `packageManager` field or from lockfiles in your project directory or parent directories.
Follow the [Node.js installation instructions](https://nodejs.org/) for your operating system (Windows, macOS, or Linux) to complete the setup. If you use an alternative package manager, install it separately:
diff --git a/src/frontend/src/content/docs/get-started/resource-mcp-servers.mdx b/src/frontend/src/content/docs/get-started/resource-mcp-servers.mdx
index c6561e3d3..187144660 100644
--- a/src/frontend/src/content/docs/get-started/resource-mcp-servers.mdx
+++ b/src/frontend/src/content/docs/get-started/resource-mcp-servers.mdx
@@ -1,6 +1,7 @@
---
title: Resource MCP servers
-description: Learn how to expose MCP tools from Aspire resources and interact with them using the CLI.
+seoTitle: Aspire resource MCP servers in the AppHost dashboard
+description: Expose MCP tools from Aspire resources and interact with them using the Aspire CLI — connect AI coding agents to databases, caches, and custom application surfaces.
---
import { Aside, Code, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -36,8 +37,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -105,8 +106,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/get-started/resources.mdx b/src/frontend/src/content/docs/get-started/resources.mdx
index 3128705f5..2acc98201 100644
--- a/src/frontend/src/content/docs/get-started/resources.mdx
+++ b/src/frontend/src/content/docs/get-started/resources.mdx
@@ -1,6 +1,7 @@
---
title: Understanding resources
-description: Learn about Aspire's resource model and how to work with different types of resources.
+seoTitle: Understand Aspire resources, resource types, and lifecycle
+description: "Learn about Aspire's resource model and how to work with different types of resources — projects, containers, executables, integrations, parameters, and connections."
lastUpdated: true
---
diff --git a/src/frontend/src/content/docs/get-started/troubleshooting.mdx b/src/frontend/src/content/docs/get-started/troubleshooting.mdx
index 6bf0923b1..c0a9399ef 100644
--- a/src/frontend/src/content/docs/get-started/troubleshooting.mdx
+++ b/src/frontend/src/content/docs/get-started/troubleshooting.mdx
@@ -1,6 +1,6 @@
---
title: Aspire troubleshooting guide
-description: Solutions to common problems when getting started with Aspire, including Docker issues, port conflicts, service discovery errors, and TypeScript AppHost issues.
+description: Solutions to common problems when getting started with Aspire — Docker issues, port conflicts, certificate trust, dashboard authentication, and dev container quirks.
---
import { Aside, Code, Steps } from '@astrojs/starlight/components';
@@ -180,10 +180,10 @@ npm --version
### SDK compilation errors
-If you encounter compilation errors in the generated `.modules/` SDK:
+If you encounter compilation errors in the generated `.aspire/modules/` SDK:
1. Ensure you have the latest version of the Aspire CLI installed.
-2. Delete the `.modules` directory and run `aspire run` again to regenerate the SDK.
+2. Delete the `.aspire/modules` directory and run `aspire run` again to regenerate the SDK.
3. Check the [Aspire GitHub issues](https://github.com/microsoft/aspire/issues) for known problems.
### Debug mode
diff --git a/src/frontend/src/content/docs/get-started/what-is-aspire.mdx b/src/frontend/src/content/docs/get-started/what-is-aspire.mdx
index a28c9397a..93d8da485 100644
--- a/src/frontend/src/content/docs/get-started/what-is-aspire.mdx
+++ b/src/frontend/src/content/docs/get-started/what-is-aspire.mdx
@@ -1,6 +1,7 @@
---
title: What is Aspire?
-description: Learn how Aspire helps you compose, debug, and deploy any distributed app with a code-first, agent-ready workflow.
+seoTitle: What is Aspire? Distributed apps made easy
+description: "Learn how Aspire helps you compose, debug, and deploy distributed apps with a code-first, agent-ready AppHost across C#, TypeScript, Python, JavaScript, and Java."
tableOfContents: true
lastUpdated: true
next:
@@ -115,8 +116,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/hi/index.mdx b/src/frontend/src/content/docs/hi/index.mdx
index a37300a3e..0e4933c40 100644
--- a/src/frontend/src/content/docs/hi/index.mdx
+++ b/src/frontend/src/content/docs/hi/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 रिलीज़ हो गया है! — Aspire 13.3 में नया क्या है देखें।
+ 🚀 Aspire 13.4 रिलीज़ हो गया है! — Aspire 13.4 में नया क्या है देखें।
hero:
tagline: आपका स्टैक, सरल।
फ्रंटएंड, API, कंटेनर और डेटाबेस को आसानी से ऑर्केस्ट्रेट करें—बिना रीराइट, बिना सीमा। किसी भी प्रोजेक्ट को शक्ति देने के लिए Aspire को विस्तारित करें।
image:
diff --git a/src/frontend/src/content/docs/id/index.mdx b/src/frontend/src/content/docs/id/index.mdx
index 16fb421a9..4ed94afcc 100644
--- a/src/frontend/src/content/docs/id/index.mdx
+++ b/src/frontend/src/content/docs/id/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 telah dirilis! — Lihat apa yang baru di Aspire 13.3.
+ 🚀 Aspire 13.4 telah dirilis! — Lihat apa yang baru di Aspire 13.4.
hero:
tagline: Stack Anda, disederhanakan.
Orkestrasi frontend, API, container, dan database dengan mudah—tanpa menulis ulang, tanpa batasan. Perluas Aspire untuk mendukung proyek apa pun.
image:
diff --git a/src/frontend/src/content/docs/index.mdx b/src/frontend/src/content/docs/index.mdx
index f8c6d3e1e..16caccce8 100644
--- a/src/frontend/src/content/docs/index.mdx
+++ b/src/frontend/src/content/docs/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- Aspire 13.3 is here! — See what's new
+ Aspire 13.4 is here! — See what's new
hero:
tagline: Your stack, streamlined.
Orchestrate frontends, APIs, containers, and databases effortlessly—no rewrites, no limits. Extend Aspire to power any project. Free, open-source, and agent ready.
image:
diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx
index afa71b25d..a2b8dd619 100644
--- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to GitHub Models
+seoTitle: Connect to GitHub Models from your .NET app with Aspire
description: Learn how to connect to the GitHub Models API from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx
index 6a7778c9b..be3d232f2 100644
--- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the GitHub Models integrations
-description: Understand why you use the Aspire GitHub Models integrations and how they fit together.
+description: Learn how the Aspire GitHub Models integrations register a GitHub Models resource and wire the .NET client to call models hosted on GitHub.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx
index e72bbad2e..105b6b7db 100644
--- a/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/github-models/github-models-host.mdx
@@ -17,7 +17,7 @@ import githubIcon from '@assets/icons/github-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire GitHub Models hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model GitHub Model resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire GitHub Models hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model GitHub Model resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the GitHub Models integration, start with the [Get started with GitHub Models integrations](/integrations/ai/github-models/github-models-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to GitHub Models](../github-models-connect/).
@@ -88,8 +88,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, GitHubModelName } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, GitHubModelName } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -135,8 +135,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -192,8 +192,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, GitHubModelName } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, GitHubModelName } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -232,8 +232,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, GitHubModelName } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, GitHubModelName } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -272,8 +272,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, GitHubModelName } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, GitHubModelName } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -310,7 +310,7 @@ GitHub Models supports a broad and growing catalog of models. Use the strongly-t
For the full catalogue, visit the [GitHub Models Marketplace](https://github.com/marketplace/models).
diff --git a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-connect.mdx b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-connect.mdx
index 8e638ccb0..25978b483 100644
--- a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Ollama
+seoTitle: "Connect to Ollama from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Ollama from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-get-started.mdx b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-get-started.mdx
index 975867b36..dd284a495 100644
--- a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Ollama integrations
-description: Understand why you use the Aspire Ollama integrations and how they fit together.
+seoTitle: Get started with the Aspire Ollama integration in .NET
+description: Learn how the Aspire Ollama integrations run an Ollama LLM resource locally and wire the OllamaSharp .NET client into your AppHost projects.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-host.mdx b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-host.mdx
index 6dee23f7b..3b469d346 100644
--- a/src/frontend/src/content/docs/integrations/ai/ollama/ollama-host.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/ollama/ollama-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Ollama in the AppHost
+seoTitle: "Set up Ollama in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Ollama hosting integration to orchestrate and configure Ollama models in an Aspire solution.
---
@@ -19,7 +20,7 @@ import ollamaIcon from '@assets/icons/ollama-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Ollama hosting integration from the [Aspire Community Toolkit](https://github.com/CommunityToolkit/Aspire). It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Ollama server and its model resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Ollama hosting integration from the [Aspire Community Toolkit](https://github.com/CommunityToolkit/Aspire). It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Ollama server and its model resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Ollama integration, start with the [Get started with Ollama integrations](/integrations/ai/ollama/ollama-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Ollama](../ollama-connect/).
@@ -70,7 +71,7 @@ This updates your `aspire.config.json` with the Ollama hosting integration packa
```
@@ -95,8 +96,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -150,8 +151,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -202,8 +203,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -260,8 +261,8 @@ ollama.AddModel("llama3");
**Nvidia:**
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -275,8 +276,8 @@ await ollama.addModel("llama3");
**AMD:**
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -289,7 +290,7 @@ await ollama.addModel("llama3");
```
@@ -319,8 +320,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -357,8 +358,8 @@ ollama.AddModel("llama3");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/ai/openai/openai-connect.mdx b/src/frontend/src/content/docs/integrations/ai/openai/openai-connect.mdx
index 651290c89..cf066589a 100644
--- a/src/frontend/src/content/docs/integrations/ai/openai/openai-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/openai/openai-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to OpenAI
+seoTitle: "Connect to OpenAI from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to the OpenAI API from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/openai/openai-get-started.mdx b/src/frontend/src/content/docs/integrations/ai/openai/openai-get-started.mdx
index fb0b88880..9bb176901 100644
--- a/src/frontend/src/content/docs/integrations/ai/openai/openai-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/openai/openai-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the OpenAI integrations
-description: Understand why you use the Aspire OpenAI integrations and how they fit together.
+seoTitle: Get started with the Aspire OpenAI integration in .NET
+description: Learn how the Aspire OpenAI integrations register an OpenAI resource, manage your API key, and wire the .NET client into your AppHost projects.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/ai/openai/openai-host.mdx b/src/frontend/src/content/docs/integrations/ai/openai/openai-host.mdx
index da6229e57..dab8e6ebf 100644
--- a/src/frontend/src/content/docs/integrations/ai/openai/openai-host.mdx
+++ b/src/frontend/src/content/docs/integrations/ai/openai/openai-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up OpenAI in the AppHost
+seoTitle: "Set up OpenAI in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire OpenAI hosting integration to orchestrate and configure OpenAI resources in an Aspire solution.
---
@@ -17,7 +18,7 @@ import openaiIcon from '@assets/icons/openai-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire OpenAI hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an OpenAI parent resource and model resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire OpenAI hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an OpenAI parent resource and model resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the OpenAI integration, start with the [Get started with OpenAI integrations](/integrations/ai/openai/openai-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to OpenAI](../openai-connect/).
@@ -90,8 +91,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -143,8 +144,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -200,8 +201,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -243,8 +244,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -284,8 +285,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-connect.mdx b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-connect.mdx
index 7ed7a161c..19275e585 100644
--- a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Garnet
+seoTitle: "Connect to Garnet from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Garnet from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-get-started.mdx b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-get-started.mdx
index 90607f6eb..a71a39320 100644
--- a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Garnet integrations
-description: Understand why you use the Aspire Garnet integrations and how they fit together.
+seoTitle: Get started with the Aspire Garnet integration in .NET
+description: Learn how the Aspire Garnet integrations provision a Garnet cache resource and wire the StackExchange.Redis-compatible client into your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-host.mdx b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-host.mdx
index af61d483f..464d9cc30 100644
--- a/src/frontend/src/content/docs/integrations/caching/garnet/garnet-host.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/garnet/garnet-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Garnet in the AppHost
+seoTitle: "Set up Garnet in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Garnet Hosting integration to orchestrate and configure a Garnet resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import garnetIcon from '@assets/icons/garnet-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Garnet Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Garnet resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Garnet Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Garnet resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Garnet integration, start with the [Get started with Garnet integrations](/integrations/caching/garnet/garnet-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Garnet](../garnet-connect/).
@@ -88,8 +89,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,8 +137,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -175,8 +176,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -219,8 +220,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -264,8 +265,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -307,8 +308,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-get-started.mdx b/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-get-started.mdx
index 8d258c5c1..ab82c0353 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with Redis distributed caching
-description: Understand why you use the Aspire Redis distributed caching integration and how it fits together.
+description: Understand why you use the Aspire Redis distributed caching integration and how it fits together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-host.mdx b/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-host.mdx
index 8caa02b35..0ac12b04a 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-host.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis-distributed/redis-distributed-host.mdx
@@ -88,8 +88,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-get-started.mdx b/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-get-started.mdx
index e79f90323..d7a8be89c 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with Redis output caching
-description: Understand why you use the Aspire Redis output caching integration and how it fits together.
+description: Understand why you use the Aspire Redis output caching integration and how it fits together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-host.mdx b/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-host.mdx
index 7b99961c6..34f7ff2f7 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-host.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis-output/redis-output-host.mdx
@@ -91,8 +91,8 @@ var apiService = builder.AddProject("apiservice")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/caching/redis/redis-connect.mdx b/src/frontend/src/content/docs/integrations/caching/redis/redis-connect.mdx
index 7ecb70779..23205d091 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis/redis-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis/redis-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Redis
+seoTitle: "Connect to Redis from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Redis from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/caching/redis/redis-get-started.mdx b/src/frontend/src/content/docs/integrations/caching/redis/redis-get-started.mdx
index a260f3397..eee0b5b1c 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis/redis-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis/redis-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Redis integrations
-description: Understand why you use the Aspire Redis integrations and how they fit together.
+seoTitle: Get started with the Aspire Redis integration in .NET
+description: "Use the Aspire Redis hosting and client integrations to spin up Redis containers, share connections from C# and TypeScript apps, and add health checks and tracing."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/caching/redis/redis-host.mdx b/src/frontend/src/content/docs/integrations/caching/redis/redis-host.mdx
index a6e7fcee8..7eacdcd8a 100644
--- a/src/frontend/src/content/docs/integrations/caching/redis/redis-host.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/redis/redis-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Redis in the AppHost
+seoTitle: "Set up Redis in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Redis Hosting integration to orchestrate and configure a Redis resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import redisIcon from '@assets/icons/redis-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Redis Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Redis resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Redis Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Redis resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Redis integration, start with the [Get started with Redis integrations](/integrations/caching/redis/redis-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Redis](../redis-connect/).
@@ -88,8 +89,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,8 +137,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -175,8 +176,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -219,8 +220,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -261,8 +262,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -299,8 +300,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -336,8 +337,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -377,8 +378,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -414,8 +415,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -480,8 +481,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-connect.mdx b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-connect.mdx
index 5902f5e4d..c4ffa75ef 100644
--- a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Valkey
+seoTitle: "Connect to Valkey from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Valkey from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-get-started.mdx b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-get-started.mdx
index c2e097096..5bc37a538 100644
--- a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Valkey integrations
-description: Understand why you use the Aspire Valkey integrations and how they fit together.
+seoTitle: Get started with the Aspire Valkey integration in .NET
+description: Learn how the Aspire Valkey integrations host a Valkey cache resource and configure the StackExchange.Redis-compatible client for your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-host.mdx b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-host.mdx
index dc6673dd9..5450d6682 100644
--- a/src/frontend/src/content/docs/integrations/caching/valkey/valkey-host.mdx
+++ b/src/frontend/src/content/docs/integrations/caching/valkey/valkey-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Valkey in the AppHost
+seoTitle: "Set up Valkey in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Valkey Hosting integration to orchestrate and configure a Valkey resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import valkeyIcon from '@assets/icons/valkey-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Valkey Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Valkey resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Valkey Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Valkey resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Valkey integration, start with the [Get started with Valkey integrations](/integrations/caching/valkey/valkey-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Valkey](../valkey-connect/).
@@ -88,8 +89,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,8 +137,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -175,8 +176,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -219,8 +220,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -261,8 +262,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -304,8 +305,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/ai-compatibility-matrix.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/ai-compatibility-matrix.mdx
index bd67624fe..531931a71 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/ai-compatibility-matrix.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/ai-compatibility-matrix.mdx
@@ -62,8 +62,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -103,8 +103,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -144,8 +144,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -185,8 +185,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/aks/index.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/aks/index.mdx
index 859d08ba5..84364cc9a 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/aks/index.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/aks/index.mdx
@@ -18,7 +18,7 @@ import kubernetesIcon from '@assets/icons/kubernetes.svg';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Kubernetes Service (AKS) hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an AKS environment and its node pools in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Kubernetes Service (AKS) hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an AKS environment and its node pools in your [`AppHost`](/get-started/app-host/) project.
The Aspire AKS hosting integration enables you to deploy your Aspire application to Azure Kubernetes Service (AKS) with full provisioning. Aspire creates the AKS cluster, Azure Container Registry (ACR), managed identity, and any Azure resources your app depends on — all from your AppHost definition.
@@ -45,8 +45,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -76,7 +76,7 @@ builder.AddAzureKubernetesEnvironment("aks")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const aks = await builder.addAzureKubernetesEnvironment('aks');
await aks.withSystemNodePool('Standard_D4s_v5', 1, 5);
```
@@ -98,7 +98,7 @@ builder.AddContainer("ml-worker", "my-ml-image")
```
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const aks = await builder.addAzureKubernetesEnvironment('aks');
const gpuPool = await aks.addNodePool('gpupool', 'Standard_NC6s_v3', 0, 5);
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-connect.mdx
index fe73032e1..8714e3d3c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure AI Foundry
+seoTitle: Connect to Azure AI Foundry from your .NET app with Aspire
description: Learn how to connect to Azure AI Foundry from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started.mdx
index 83e9ac36a..fb9da4016 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure AI Foundry integrations
-description: Understand why you use the Aspire Azure AI Foundry integrations and how they fit together.
+description: Understand why you use the Aspire Azure AI Foundry integrations and how they fit together in your Aspire AppHost.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx
index fdea97501..371340207 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-host.mdx
@@ -22,7 +22,7 @@ import agentResponsesResultLight from '@assets/integrations/cloud/azure/azure-ai
data-zoom-off
/>
-This article is the reference for the Aspire Azure AI Foundry hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Foundry account, model deployments, Foundry projects, hosted agents, and prompt agents in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure AI Foundry hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Foundry account, model deployments, Foundry projects, hosted agents, and prompt agents in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure AI Foundry integration, start with the [Get started with Azure AI Foundry integrations](/integrations/cloud/azure/azure-ai-foundry/azure-ai-foundry-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure AI Foundry](../azure-ai-foundry-connect/).
@@ -38,7 +38,8 @@ aspire add azure-ai-foundry
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -67,7 +68,8 @@ aspire add azure-ai-foundry
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the Azure AI Foundry hosting integration package:
@@ -106,8 +108,8 @@ builder.AddProject()
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -126,7 +128,11 @@ await builder.build().run();
The preceding code adds an Azure AI Foundry resource named `foundry` to the AppHost project. The `WithReference` method passes the connection information to the `ExampleProject` project.
## Add a Foundry deployment resource
@@ -153,8 +159,8 @@ builder.AddProject()
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -204,8 +210,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -269,8 +275,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -321,8 +327,8 @@ var project = foundry.AddProject("my-project")
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -374,8 +380,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -417,6 +423,9 @@ builder.WebHost.UseUrls($"http://+:{port}");
If your hosted agent listens on a different port, declare the endpoint before calling `PublishAsHostedAgent(...)`:
+
+
+
```csharp
var dotnetWeatherAgent = builder.AddProject("weather-agent-dotnet")
.WithHttpEndpoint(targetPort: 9000)
@@ -426,6 +435,27 @@ var dotnetWeatherAgent = builder.AddProject("weath
dotnetWeatherAgent.PublishAsHostedAgent(project);
```
+
+
+
+```typescript
+const dotnetWeatherAgent = await builder
+ .addProject(
+ 'weather-agent-dotnet',
+ '../WeatherAgent.Dotnet/WeatherAgent.Dotnet.csproj'
+ )
+ .withHttpEndpoint({ targetPort: 9000 })
+ .withReference(project)
+ .waitFor(project)
+ .withReference(chat)
+ .waitFor(chat);
+
+await dotnetWeatherAgent.publishAsHostedAgent({ project });
+```
+
+
+
+
In run mode, Aspire also adds dashboard URLs for `/responses`, `/liveness`, and `/readiness`, configures `/liveness` as an HTTP health check, adds a dashboard command for sending a message to `/responses`, and enables OpenTelemetry environment variables for agent instrumentation.
For .NET hosted agents, add your Service Defaults project reference and call `builder.AddServiceDefaults()` in the hosted-agent app so logs, metrics, traces, HTTP instrumentation, and OTLP export flow into the Aspire dashboard. Then enable telemetry on the Foundry Responses chat client that backs the Microsoft Agent Framework (MAF) agent.
@@ -463,16 +493,15 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const foundry = await builder.addFoundry('foundry');
const project = await foundry.addProject('my-project');
-const chat = await project.addModelDeploymentFromModel('chat', {
- name: 'gpt-5-mini',
- version: '2025-06-01',
+const chat = await project.addModelDeployment('chat', 'gpt-5-mini', {
+ modelVersion: '2025-06-01',
format: 'OpenAI',
});
@@ -547,8 +576,8 @@ builder.AddProject()
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -572,7 +601,15 @@ await builder.build().run();
## Use Foundry Local for development
@@ -600,8 +637,8 @@ builder.AddProject()
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -656,8 +693,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, FoundryRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, FoundryRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -665,7 +702,7 @@ const foundry = await builder.addFoundry('chat');
await builder
.addProject('api', '../Api/Api.csproj')
- .withRoleAssignments(foundry, [FoundryRole.CognitiveServicesUser])
+ .withFoundryRoleAssignments(foundry, [FoundryRole.CognitiveServicesUser])
.withReference(foundry);
await builder.build().run();
@@ -786,6 +823,13 @@ builder.AddFoundry("foundry")
});
```
+
+
The preceding code:
- Chains a call to the `ConfigureInfrastructure` API:
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-connect.mdx
index bdc4060d1..75608c76d 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure AI Inference
+seoTitle: Connect to Azure AI Inference from your .NET app with Aspire
description: Learn how to connect to Azure AI Inference from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-get-started.mdx
index b0c09d27d..55c03fcbf 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure AI Inference integrations
-description: Understand why you use the Aspire Azure AI Inference integrations and how they fit together.
+description: Understand why you use the Aspire Azure AI Inference integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-host.mdx
index 7dd1d7983..7b8bfbe4c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-inference/azure-ai-inference-host.mdx
@@ -44,8 +44,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-connect.mdx
index 5ba1164bc..ba82ce18b 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure AI Search
+seoTitle: Connect to Azure AI Search from your .NET app with Aspire
description: Learn how to connect to Azure AI Search from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-get-started.mdx
index 1dd246f2e..8f7408e33 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with Azure AI Search integrations
-description: Understand why you use the Aspire Azure AI Search integrations and how they fit together.
+description: Learn how the Aspire Azure AI Search integrations provision an Azure AI Search resource and wire the .NET client for vector and full-text search.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-host.mdx
index 27cc85006..01eafaeb4 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-ai-search/azure-ai-search-host.mdx
@@ -17,7 +17,7 @@ import searchIcon from '@assets/icons/azure-search-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure AI Search Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure AI Search resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure AI Search Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure AI Search resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure AI Search integration, start with the [Get started with Azure AI Search integrations](/integrations/cloud/azure/azure-ai-search/azure-ai-search-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure AI Search](../azure-ai-search-connect/).
@@ -89,8 +89,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -142,8 +142,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -256,8 +256,8 @@ builder.AddAzureSearch("search")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -310,8 +310,8 @@ builder.AddProject("apiservice")
Use `withRoleAssignments` to assign specific roles from the `AzureSearchRole` enum to a resource:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureSearchRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureSearchRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-get-started.mdx
index 55587a8f8..42b9622fc 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-get-started.mdx
@@ -1,6 +1,6 @@
----
+---
title: Get started with Azure App Configuration integrations
-description: Understand why you use the Aspire Azure App Configuration integrations and how they fit together.
+description: Understand why you use the Aspire Azure App Configuration integrations and how they fit together in your Aspire AppHost.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-host.mdx
index 5ef283bf0..f2d988f4b 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-host.mdx
@@ -17,7 +17,7 @@ import appConfigIcon from '@assets/icons/azure-appconfig-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure App Configuration Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure App Configuration store in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure App Configuration Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure App Configuration store in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure App Configuration integration, start with the [Get started with Azure App Configuration integrations](/integrations/cloud/azure/azure-app-configuration/azure-app-configuration-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure App Configuration](../azure-app-configuration-connect/).
@@ -93,8 +93,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -205,8 +205,8 @@ builder.AddAzureAppConfiguration("config")
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -257,8 +257,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -301,8 +301,8 @@ var appConfig = builder.AddAzureAppConfiguration("config")
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -343,8 +343,8 @@ var appConfig = builder.AddAzureAppConfiguration("config")
-```typescript title="apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -383,8 +383,8 @@ var appConfig = builder.AddAzureAppConfiguration("config")
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -425,8 +425,8 @@ var appConfig = builder.AddAzureAppConfiguration("config")
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -473,8 +473,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -517,8 +517,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -573,8 +573,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder, AzureAppConfigurationRole } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder, AzureAppConfigurationRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-get-started.mdx
index bc425a488..ca59ca23c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure App Service integration
-description: Understand why you use the Aspire Azure App Service integration and how it fits together.
+description: Learn how the Aspire Azure App Service integration deploys your Aspire AppHost resources to Azure App Service using the Azure provisioning model.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-host.mdx
index 5446a6ad9..d96300cbc 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-app-service/azure-app-service-host.mdx
@@ -4,7 +4,13 @@ description: Learn how to use the Aspire Azure App Service Hosting integration t
---
import { Image } from 'astro:assets';
-import { Aside, Badge, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
+import {
+ Aside,
+ Badge,
+ Steps,
+ Tabs,
+ TabItem,
+} from '@astrojs/starlight/components';
import LearnMore from '@components/LearnMore.astro';
import InstallPackage from '@components/InstallPackage.astro';
import appServiceIcon from '@assets/icons/azure-app-services.svg';
@@ -20,7 +26,7 @@ import appServiceIcon from '@assets/icons/azure-app-services.svg';
-This article is the reference for the Aspire Azure App Service Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure App Service environment in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure App Service Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure App Service environment in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure App Service integration, start with the [Get started with the Azure App Service integration](/integrations/cloud/azure/azure-app-service/azure-app-service-get-started/) guide. For how deployed apps consume the runtime configuration this integration injects, see [Azure App Service runtime configuration](../azure-app-service-connect/).
@@ -36,7 +42,8 @@ aspire add Aspire.Hosting.Azure.AppService
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -57,7 +64,8 @@ aspire add Aspire.Hosting.Azure.AppService
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the hosting integration package:
@@ -94,14 +102,15 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-const appServiceEnv = await builder.addAzureAppServiceEnvironment("app-service-env");
+const appServiceEnv =
+ await builder.addAzureAppServiceEnvironment('app-service-env');
-await builder.addProject("api", "../WebApi/WebApi.csproj");
+await builder.addProject('api', '../WebApi/WebApi.csproj');
await builder.build().run();
```
@@ -120,11 +129,19 @@ await builder.build().run();
When the App Service environment is provisioned in Azure, the following resources are created:
@@ -159,9 +176,29 @@ builder.Build().Run();
-:::note
-The TypeScript AppHost doesn't currently expose an `asExisting` API for `AzureAppServiceEnvironmentResource`. To target an existing App Service plan from a TypeScript AppHost, use [`builder.addConnectionString(...)`](/get-started/app-host/) with the necessary parameters.
-:::
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const existingAppServicePlanName = await builder.addParameter(
+ 'existingAppServicePlanName'
+);
+const existingResourceGroup = await builder.addParameter(
+ 'existingResourceGroup'
+);
+
+const appServiceEnv =
+ await builder.addAzureAppServiceEnvironment('app-service-env');
+await appServiceEnv.asExisting(
+ existingAppServicePlanName,
+ existingResourceGroup
+);
+
+await builder.addProject('api', '../WebApi/WebApi.csproj');
+
+await builder.build().run();
+```
@@ -199,18 +236,18 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-await builder.addAzureAppServiceEnvironment("app-service-env");
+await builder.addAzureAppServiceEnvironment('app-service-env');
-const api = await builder.addProject("api", "../WebApi/WebApi.csproj");
+const api = await builder.addProject('api', '../WebApi/WebApi.csproj');
await api.publishAsAzureAppServiceWebsite({
- configure: async (infra, website) => {
- // Customize infrastructure here using Azure Provisioning APIs
- },
+ configure: async (infra, website) => {
+ // Customize infrastructure here using Azure Provisioning APIs
+ },
});
await builder.build().run();
@@ -226,7 +263,14 @@ The preceding code:
- In C#, adds an application setting for `ASPNETCORE_ENVIRONMENT` and metadata tags.
## Deployment slots
@@ -258,19 +302,24 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-await (await builder.addAzureAppServiceEnvironment("appservice"))
- .withDeploymentSlot("staging");
+await (
+ await builder.addAzureAppServiceEnvironment('appservice')
+).withDeploymentSlot('staging');
-const apiService = await builder.addProject("apiservice", "../ApiService/ApiService.csproj");
+const apiService = await builder.addProject(
+ 'apiservice',
+ '../ApiService/ApiService.csproj'
+);
-await builder.addProject("webfrontend", "../Web/Web.csproj")
- .withReference(apiService)
- .waitFor(apiService);
+await builder
+ .addProject('webfrontend', '../Web/Web.csproj')
+ .withReference(apiService)
+ .waitFor(apiService);
await builder.build().run();
```
@@ -310,15 +359,16 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-const slotName = await builder.addParameter("deploymentSlot");
+const slotName = await builder.addParameter('deploymentSlot');
-await (await builder.addAzureAppServiceEnvironment("appservice"))
- .withDeploymentSlot(slotName);
+await (
+ await builder.addAzureAppServiceEnvironment('appservice')
+).withDeploymentSlot(slotName);
// Add your projects and other resources...
@@ -333,7 +383,9 @@ With this configuration, provide a value for the `deploymentSlot` parameter when
### Applying customizations to slots
When you customize App Service resources using `PublishAsAzureAppServiceWebsite` (or `publishAsAzureAppServiceWebsite`) or `ConfigureInfrastructure`, those customizations apply to the production slot by default. Apply them separately to each slot when needed using the `configureSlot` option:
@@ -352,15 +404,15 @@ builder.AddProject("api")
-```typescript title="apphost.ts"
-const api = await builder.addProject("api", "../WebApi/WebApi.csproj");
+```typescript title="apphost.mts"
+const api = await builder.addProject('api', '../WebApi/WebApi.csproj');
await api.publishAsAzureAppServiceWebsite({
- configure: async (infra, website) => {
- // Production website customizations
- },
- configureSlot: async (infra, slot) => {
- // Deployment slot customizations
- },
+ configure: async (infra, website) => {
+ // Production website customizations
+ },
+ configureSlot: async (infra, slot) => {
+ // Deployment slot customizations
+ },
});
```
@@ -399,15 +451,16 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-await (await builder.addAzureAppServiceEnvironment("app-service-env"))
- .configureInfrastructure(async (infra) => {
- // Customize Azure Provisioning resources here
- });
+await (
+ await builder.addAzureAppServiceEnvironment('app-service-env')
+).configureInfrastructure(async (infra) => {
+ // Customize Azure Provisioning resources here
+});
await builder.build().run();
```
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-application-insights.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-application-insights.mdx
index 5e0893698..54b174b43 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-application-insights.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-application-insights.mdx
@@ -17,7 +17,7 @@ import appInsightsIcon from '@assets/icons/azure-appinsights-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Application Insights integration. It covers the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Application Insights resource in your [`AppHost`](/get-started/app-host/) project, as well as how to configure the Application Insights SDK in consuming apps.
+This article is the reference for the Aspire Azure Application Insights integration. It covers the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Application Insights resource in your [`AppHost`](/get-started/app-host/) project, as well as how to configure the Application Insights SDK in consuming apps.
[Azure Application Insights](https://azure.microsoft.com/services/monitor/) is an extensible Application Performance Management (APM) service for developers and DevOps professionals. The Aspire Azure Application Insights integration enables you to provision Application Insights resources for collecting telemetry data from your applications.
@@ -95,8 +95,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -149,8 +149,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -193,8 +193,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -284,8 +284,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-get-started.mdx
index d0e93af1d..80dd0af46 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Cache for Redis integrations
-description: Understand why you use the Aspire Azure Cache for Redis integrations and how they fit together.
+description: Understand why you use the Aspire Azure Cache for Redis integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-host.mdx
index 19dc26302..d69a619e3 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-host.mdx
@@ -17,7 +17,7 @@ import cacheRedisIcon from '@assets/icons/azure-cacheredis-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Cache for Redis Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure managed Redis cache resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Cache for Redis Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure managed Redis cache resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Cache for Redis integration, start with the [Get started with Azure Cache for Redis integrations](/integrations/cloud/azure/azure-cache-redis/azure-cache-redis-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Cache for Redis](../azure-cache-redis-connect/).
@@ -89,8 +89,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -145,8 +145,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -191,8 +191,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -233,8 +233,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -345,8 +345,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect.mdx
index 57cd45cb9..a31665c1e 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect.mdx
@@ -49,7 +49,7 @@ var acr = builder.AddAzureContainerRegistry("my-acr");
var loginServer = acr.GetOutput("loginServer");
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const acr = await builder.addAzureContainerRegistry("my-acr");
const loginServer = await acr.getOutput("loginServer");
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-get-started.mdx
index a0d2139d0..e22e20aac 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-get-started.mdx
@@ -1,10 +1,18 @@
---
-title: Get started with the Azure Container Registry integration
-description: Understand why you use the Aspire Azure Container Registry integration and how it fits together.
+title: Azure Container Registry integration overview
+description: Use the Aspire Azure Container Registry hosting and client integrations to provision registries, push images during deployment, and pull them at runtime from your apps.
---
import { Image } from 'astro:assets';
-import { Aside, CardGrid, LinkButton, LinkCard, Steps } from '@astrojs/starlight/components';
+import {
+ Aside,
+ CardGrid,
+ LinkButton,
+ LinkCard,
+ Steps,
+ Tabs,
+ TabItem,
+} from '@astrojs/starlight/components';
import InstallPackage from '@components/InstallPackage.astro';
import containerRegistryIcon from '@assets/icons/azure-container-registry-icon.svg';
@@ -58,27 +66,29 @@ Getting there is a two-step process: model the registry in your AppHost, then un
1. ### Model Azure Container Registry in your AppHost
- Add the Azure Container Registry hosting integration to your AppHost, then declare a registry resource and wire it to a compute environment. The [Azure Container Registry Hosting integration](/integrations/cloud/azure/azure-container-registry/azure-container-registry-host/) article walks through every capability — provisioning a new registry, referencing an existing one, scheduling image cleanup with purge tasks, role assignments, and customizing the generated Bicep — with side-by-side C# and TypeScript examples.
+ Add the Azure Container Registry hosting integration to your AppHost, then declare a registry resource and wire it to a compute environment. The [Azure Container Registry Hosting integration](/integrations/cloud/azure/azure-container-registry/azure-container-registry-host/) article walks through every capability — provisioning a new registry, referencing an existing one, scheduling image cleanup with purge tasks, role assignments, and customizing the generated Bicep — with side-by-side C# and TypeScript examples.
-
- Set up Azure Container Registry in the AppHost
-
+
+ Set up Azure Container Registry in the AppHost
+
2. ### Use the registry at deploy time
- When your app deploys, Aspire uses the registry resource to wire up image push and pull workflows. See [Connect to Azure Container Registry](/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect/) for the registry outputs reference — including `loginServer` — and guidance on integrating the registry into your deployment pipeline.
+ When your app deploys, Aspire uses the registry resource to wire up image push and pull workflows. See [Connect to Azure Container Registry](/integrations/cloud/azure/azure-container-registry/azure-container-registry-connect/) for the registry outputs reference — including `loginServer` — and guidance on integrating the registry into your deployment pipeline.
-
- Use Azure Container Registry at deploy time
-
+
+ Use Azure Container Registry at deploy time
+
@@ -101,7 +111,9 @@ Getting there is a two-step process: model the registry in your AppHost, then un
In this introduction, you'll see how to install and use the Aspire Azure Container Registry integration in a simple configuration. If you already have this knowledge, see [Azure Container Registry Hosting integration](/integrations/cloud/azure/azure-container-registry/azure-container-registry-host/) for full reference details.
## Key capabilities
@@ -129,6 +141,9 @@ To begin, install the Aspire Azure Container Registry Hosting integration in you
Next, in the AppHost project, create an Azure Container Registry resource and wire it to a compute environment:
+
+
+
```csharp title="C# — AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
@@ -142,6 +157,27 @@ builder.AddAzureContainerAppEnvironment("env")
builder.Build().Run();
```
+
+
+
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+// Add (or reference) the registry
+const acr = await builder.addAzureContainerRegistry('my-acr');
+
+// Wire an environment to that registry
+const env = await builder.addAzureContainerAppEnvironment('env');
+await env.withAzureContainerRegistry(acr);
+
+await builder.build().run();
+```
+
+
+
+
The preceding code:
- Creates a new Azure Container Registry named `my-acr`.
@@ -152,8 +188,9 @@ The preceding code:
For more information on how the Azure Container Registry integration works, see:
-
+
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-host.mdx
index 4e7b60bd3..2ae6120f8 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-container-registry/azure-container-registry-host.mdx
@@ -17,7 +17,7 @@ import containerRegistryIcon from '@assets/icons/azure-container-registry-icon.s
data-zoom-off
/>
-This article is the reference for the Aspire Azure Container Registry Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Container Registry resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Container Registry Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Container Registry resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Container Registry integration, start with the [Get started with Azure Container Registry integrations](/integrations/cloud/azure/azure-container-registry/azure-container-registry-get-started/) guide. For how the registry is consumed at deployment time — including the `loginServer` output — see [Connect to Azure Container Registry](../azure-container-registry-connect/).
@@ -98,8 +98,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -147,8 +147,8 @@ var registry = env.GetAzureContainerRegistry();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -204,8 +204,8 @@ var acr = builder.AddAzureContainerRegistry("my-acr")
Use `publishAsExisting` to reference an existing registry only in publish (deployment) mode:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -223,7 +223,7 @@ await builder.build().run();
Use `asExisting` to reference an existing registry in both run and publish modes:
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const acr = await builder.addAzureContainerRegistry("my-acr");
await acr.asExisting(registryName, { resourceGroup: rgName });
```
@@ -253,8 +253,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureContainerRegistryRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureContainerRegistryRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -291,8 +291,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -363,7 +363,7 @@ var acr = builder.AddAzureContainerRegistry("my-acr")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const acr = await builder.addAzureContainerRegistry("my-acr");
await acr.configureInfrastructure(async (infra) => {
// Use the Bicep infrastructure object to customize the registry
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-connect.mdx
index 14b2eb431..216a2cd14 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Cosmos DB
+seoTitle: Connect to Azure Cosmos DB from your .NET app with Aspire
description: Learn how to connect to Azure Cosmos DB from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started.mdx
index b267377b7..2eb041280 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Cosmos DB integrations
-description: Understand why you use the Aspire Azure Cosmos DB integrations and how they fit together.
+description: Learn how the Aspire Azure Cosmos DB integrations provision an Azure Cosmos DB account resource and wire the .NET client into your AppHost projects.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-host.mdx
index 1477cd90e..7984dd63b 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-host.mdx
@@ -20,7 +20,7 @@ import cosmosResourceRelationshipsLight from '@assets/integrations/cloud/azure/c
data-zoom-off
/>
-This article is the reference for the Aspire Azure Cosmos DB hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Cosmos DB account, databases, and containers in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Cosmos DB hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Cosmos DB account, databases, and containers in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Cosmos DB integration, start with the [Get started with Azure Cosmos DB integrations](/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Cosmos DB](../azure-cosmos-db-connect/).
@@ -91,8 +91,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -130,8 +130,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -170,8 +170,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -212,8 +212,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -250,8 +250,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -315,8 +315,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -357,8 +357,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -402,8 +402,8 @@ var db = cosmos.AddCosmosDatabase("db");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -434,8 +434,8 @@ var container = db.AddContainer("entries", "/id");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -477,8 +477,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -530,8 +530,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -643,8 +643,8 @@ builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-data-explorer.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-data-explorer.mdx
index 4788efbd4..31268ebf9 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-data-explorer.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-data-explorer.mdx
@@ -17,7 +17,7 @@ import kustoIcon from '@assets/icons/azure-dataexplorer-icon.svg';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Data Explorer (Kusto) hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Data Explorer clusters and databases in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Data Explorer (Kusto) hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Data Explorer clusters and databases in your [`AppHost`](/get-started/app-host/) project.
[Azure Data Explorer](https://azure.microsoft.com/services/data-explorer/) (also known as Kusto) is a fast and highly scalable data exploration service for log and telemetry data. The hosting integration models the following types:
@@ -94,8 +94,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -142,8 +142,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -182,8 +182,8 @@ var kusto = builder.AddAzureKustoCluster("kusto")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -318,8 +318,8 @@ kusto.AddReadWriteDatabase("analytics");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-default-credential.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-default-credential.mdx
index fc360631d..ebe53bc9e 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-default-credential.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-default-credential.mdx
@@ -1,6 +1,6 @@
---
title: Default Azure credential
-description: Learn about the default credential behavior in Aspire Azure client integrations and how to customize it.
+description: Learn about the default credential behavior in Aspire Azure client integrations and how to customize it in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-connect.mdx
index 765623ef4..899c87cad 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Event Hubs
+seoTitle: Connect to Azure Event Hubs from your .NET app with Aspire
description: Learn how to connect to Azure Event Hubs from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-get-started.mdx
index 5797287b5..afb4d43c1 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Event Hubs integrations
-description: Understand why you use the Aspire Azure Event Hubs integrations and how they fit together.
+description: Understand why you use the Aspire Azure Event Hubs integrations and how they fit together in your Aspire AppHost.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-host.mdx
index 1ebd5337c..48b9dd188 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-host.mdx
@@ -17,7 +17,7 @@ import eventHubsIcon from '@assets/icons/azure-eventhubs-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Event Hubs Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Event Hubs namespace and its hubs in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Event Hubs Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Event Hubs namespace and its hubs in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Event Hubs integration, start with the [Get started with Azure Event Hubs integrations](/integrations/cloud/azure/azure-event-hubs/azure-event-hubs-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Event Hubs](../azure-event-hubs-connect/).
@@ -96,8 +96,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -148,8 +148,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -188,8 +188,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -238,8 +238,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -346,8 +346,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -425,8 +425,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -473,8 +473,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureEventHubsRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureEventHubsRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -590,8 +590,8 @@ builder.AddAzureEventHubs("event-hubs")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-front-door.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-front-door.mdx
index 19f65a614..af45776c3 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-front-door.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-front-door.mdx
@@ -1,5 +1,6 @@
---
title: Azure Front Door
+seoTitle: Azure Front Door integration for Aspire apps
description: Learn how to use the Aspire Azure Front Door hosting integration to put a global edge in front of your application's backends.
---
@@ -54,8 +55,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -118,8 +119,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -151,6 +152,10 @@ Front Door uses health probes to determine which origins are healthy. By default
When you publish your app, Aspire generates Bicep alongside the manifest. A Front Door resource with a single origin generates Bicep similar to the following:
+
+
```bicep title="Generated Bicep — frontdoor.bicep"
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
@@ -158,7 +163,7 @@ param location string = resourceGroup().location
param my_api_host string
resource frontdoor 'Microsoft.Cdn/profiles@2025-06-01' = {
- name: take('frontdoor-${uniqueString(resourceGroup().id)}', 90)
+ name: take('frontdoor-${uniqueString(resourceGroup().id)}', 260)
location: 'Global'
sku: {
name: 'Standard_AzureFrontDoor'
@@ -169,13 +174,13 @@ resource frontdoor 'Microsoft.Cdn/profiles@2025-06-01' = {
}
resource my_apiEndpoint 'Microsoft.Cdn/profiles/afdEndpoints@2025-06-01' = {
- name: take('my-api-${uniqueString(resourceGroup().id)}', 46)
+ name: take('myapiEndpoint-${uniqueString(resourceGroup().id)}', 46)
location: 'Global'
parent: frontdoor
}
resource my_apiOriginGroup 'Microsoft.Cdn/profiles/originGroups@2025-06-01' = {
- name: take('my-api-og-${uniqueString(resourceGroup().id)}', 90)
+ name: take('myapiOriginGroup-${uniqueString(resourceGroup().id)}', 90)
properties: {
healthProbeSettings: {
probePath: '/'
@@ -191,7 +196,7 @@ resource my_apiOriginGroup 'Microsoft.Cdn/profiles/originGroups@2025-06-01' = {
}
resource my_apiOrigin 'Microsoft.Cdn/profiles/originGroups/origins@2025-06-01' = {
- name: take('my-api-origin-${uniqueString(resourceGroup().id)}', 90)
+ name: take('myapiOrigin-${uniqueString(resourceGroup().id)}', 90)
properties: {
hostName: my_api_host
originHostHeader: my_api_host
@@ -200,7 +205,7 @@ resource my_apiOrigin 'Microsoft.Cdn/profiles/originGroups/origins@2025-06-01' =
}
resource my_apiRoute 'Microsoft.Cdn/profiles/afdEndpoints/routes@2025-06-01' = {
- name: take('my-api-route-${uniqueString(resourceGroup().id)}', 90)
+ name: take('myapiRoute-${uniqueString(resourceGroup().id)}', 90)
properties: {
forwardingProtocol: 'HttpsOnly'
httpsRedirect: 'Enabled'
@@ -257,8 +262,8 @@ var frontDoor = builder.AddAzureFrontDoor("frontdoor")
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-get-started.mdx
index c61112603..beb786fec 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Functions integration
-description: Understand why you use the Aspire Azure Functions integration and how it fits together.
+description: Learn how the Aspire Azure Functions integration runs an Azure Functions worker resource locally and orchestrates it alongside the rest of your AppHost.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-host.mdx
index 5c03e22fd..360917f9b 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-functions/azure-functions-host.mdx
@@ -18,7 +18,7 @@ import vsAzureFunctionsOptions from '@assets/integrations/cloud/azure/functions/
data-zoom-off
/>
-This article is the reference for the Aspire Azure Functions Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Functions project resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Functions Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Functions project resource in your [`AppHost`](/get-started/app-host/) project.
If you are new to the Azure Functions integration, start with the [Get started with the Azure Functions integration](/integrations/cloud/azure/azure-functions/azure-functions-get-started/) guide. For how your Functions code reads the connection information this page sets up, see [Azure Functions runtime configuration](../azure-functions-connect/).
@@ -139,8 +139,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -201,8 +201,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -272,8 +272,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -315,8 +315,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -374,8 +374,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-connect.mdx
index d0ce69438..ac49b9e07 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Key Vault
+seoTitle: Connect to Azure Key Vault from your .NET app with Aspire
description: Learn how to connect to Azure Key Vault from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-get-started.mdx
index 86225f952..cd6ce8dda 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Key Vault integrations
-description: Understand why you use the Aspire Azure Key Vault integrations and how they fit together.
+description: Learn how the Aspire Azure Key Vault integrations provision an Azure Key Vault resource and wire the .NET secret client into your AppHost projects.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-host.mdx
index 1d1214188..d97f6627a 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-key-vault/azure-key-vault-host.mdx
@@ -17,7 +17,7 @@ import keyVaultIcon from '@assets/icons/azure-keyvault-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Key Vault Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Key Vault resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Key Vault Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Key Vault resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Key Vault integration, start with the [Get started with Azure Key Vault integrations](/integrations/cloud/azure/azure-key-vault/azure-key-vault-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Key Vault](../azure-key-vault-connect/).
@@ -92,8 +92,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -151,8 +151,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -204,8 +204,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder, AzureKeyVaultRole } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder, AzureKeyVaultRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -248,8 +248,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -288,8 +288,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -397,8 +397,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-log-analytics.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-log-analytics.mdx
index 6ecd5f7da..2cdf44221 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-log-analytics.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-log-analytics.mdx
@@ -1,5 +1,6 @@
---
title: Azure Log Analytics
+seoTitle: Azure Log Analytics integration for Aspire apps
description: Learn how to use the Azure Log Analytics hosting integration to add Log Analytics workspaces to your Aspire application for centralized logging and monitoring.
---
@@ -17,7 +18,7 @@ import logAnalyticsIcon from '@assets/icons/azure-loganalytics-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Log Analytics Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Log Analytics workspace resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Log Analytics Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Log Analytics workspace resources in your [`AppHost`](/get-started/app-host/) project.
[Azure Log Analytics](https://azure.microsoft.com/services/monitor/) is a tool in Azure Monitor that allows you to edit and run log queries against data in Azure Monitor Logs. The Aspire Azure Log Analytics integration enables you to provision Log Analytics workspaces for centralized logging and monitoring.
@@ -33,7 +34,8 @@ aspire add azure-operational-insights
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -54,7 +56,8 @@ aspire add azure-operational-insights
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the Azure Log Analytics hosting integration package:
@@ -76,6 +79,7 @@ The Aspire Azure Log Analytics hosting integration models the Log Analytics work
+
```csharp title="C# — AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
@@ -83,11 +87,13 @@ var logAnalytics = builder.AddAzureLogAnalyticsWorkspace("log-analytics");
// After adding all resources, run the app...
builder.Build().Run();
+
```
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -95,14 +101,21 @@ const logAnalytics = await builder.addAzureLogAnalyticsWorkspace("log-analytics"
// After adding all resources, run the app...
await builder.build().run();
-```
+
+````
+
The preceding code adds an Azure Log Analytics workspace resource named `log-analytics` to the application model.
## Use with Application Insights
@@ -111,6 +124,7 @@ A common pattern is to use a Log Analytics workspace with Application Insights f
+
```csharp title="C# — AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
@@ -118,27 +132,32 @@ var logAnalytics = builder.AddAzureLogAnalyticsWorkspace("log-analytics");
var appInsights = builder.AddAzureApplicationInsights("app-insights", logAnalytics);
builder.AddProject()
- .WithReference(appInsights);
+.WithReference(appInsights);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
-const logAnalytics = await builder.addAzureLogAnalyticsWorkspace("log-analytics");
-const appInsights = await builder.addAzureApplicationInsights("app-insights", logAnalytics);
+const logAnalytics =
+ await builder.addAzureLogAnalyticsWorkspace('log-analytics');
+const appInsights = await builder.addAzureApplicationInsights('app-insights');
+await appInsights.withLogAnalyticsWorkspace(logAnalytics);
-await builder.addNodeApp("api", "./api", "index.js")
- .withReference(appInsights);
+const api = await builder.addNodeApp('api', './api', 'index.js');
+await api.withReference(appInsights);
-// After adding all resources, run the app...
await builder.build().run();
```
+
@@ -154,8 +173,8 @@ For more information, see [Azure Application Insights integration](/integrations
The Azure Log Analytics workspace resource exposes the following connection property:
-| Property name | Description |
-|---------------|-------------|
+| Property name | Description |
+| ------------------------- | ----------------------------------------------- |
| `logAnalyticsWorkspaceId` | The resource ID of the Log Analytics workspace. |
## Provisioning-generated Bicep
@@ -209,6 +228,13 @@ var logAnalytics = builder.AddAzureLogAnalyticsWorkspace("log-analytics")
var appInsights = builder.AddAzureApplicationInsights("app-insights", logAnalytics);
```
+
+
The preceding code:
- Chains a call to the `ConfigureInfrastructure` API:
@@ -221,7 +247,10 @@ For more information, see [Customize Azure resources](/integrations/cloud/azure/
## Client integration
## See also
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-connect.mdx
index ef097566e..4aec4825d 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure OpenAI
+seoTitle: Connect to Azure OpenAI from your .NET app with Aspire
description: Learn how to connect to Azure OpenAI from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-get-started.mdx
index 9a194817f..73f124e5f 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-get-started.mdx
@@ -1,6 +1,6 @@
----
+---
title: Get started with the Azure OpenAI integrations
-description: Understand why you use the Aspire Azure OpenAI integrations and how they fit together.
+description: Learn how the Aspire Azure OpenAI integrations provision an Azure OpenAI resource and wire the .NET client to call chat and embedding models.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-host.mdx
index 99d643455..d551db47a 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-openai/azure-openai-host.mdx
@@ -17,7 +17,7 @@ import openaiIcon from '@assets/icons/azure-openai-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure OpenAI hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure OpenAI account and deployment resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure OpenAI hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure OpenAI account and deployment resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure OpenAI integration, start with the [Get started with Azure OpenAI integrations](/integrations/cloud/azure/azure-openai/azure-openai-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure OpenAI](../azure-openai-connect/).
@@ -94,8 +94,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -158,8 +158,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -207,8 +207,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, AzureOpenAIRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, AzureOpenAIRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -244,8 +244,8 @@ var openai = builder.AddAzureOpenAI("openai")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -280,8 +280,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -412,8 +412,8 @@ builder.AddAzureOpenAI("openai")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-get-started.mdx
index 2ddab7137..307561b7c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-get-started.mdx
@@ -1,6 +1,6 @@
---
-title: Get started with the Azure Database for PostgreSQL integrations
-description: Understand why you use the Aspire Azure Database for PostgreSQL integrations and how they fit together.
+title: Azure Database for PostgreSQL integrations overview
+description: "Use the Aspire Azure Database for PostgreSQL hosting and client integrations to provision flexible servers, configure firewalls, and connect from C# and TypeScript apps."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-host.mdx
index d055da2c8..73518a871 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-postgresql/azure-postgresql-host.mdx
@@ -17,7 +17,7 @@ import postgresqlIcon from '@assets/icons/azure-postgresql-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure PostgreSQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Database for PostgreSQL flexible server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure PostgreSQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Database for PostgreSQL flexible server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure PostgreSQL integration, start with the [Get started with Azure Database for PostgreSQL integrations](/integrations/cloud/azure/azure-postgresql/azure-postgresql-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure PostgreSQL](../azure-postgresql-connect/). For the PostgreSQL Entity Framework Core (EF Core) client integration, see [Get started with the PostgreSQL Entity Framework Core integrations](/integrations/databases/efcore/postgres/postgresql-get-started/).
@@ -33,7 +33,8 @@ aspire add azure-postgres
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -54,7 +55,8 @@ aspire add azure-postgres
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the Azure PostgreSQL hosting integration package:
@@ -83,17 +85,18 @@ var postgres = builder.AddAzurePostgresFlexibleServer("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject("apiservice")
- .WaitFor(postgresdb)
- .WithReference(postgresdb);
+.WaitFor(postgresdb)
+.WithReference(postgresdb);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -105,18 +108,28 @@ await builder.addNodeApp("api", "./api", "index.js")
.withReference(postgresdb);
// After adding all resources, run the app...
-```
+````
+
The preceding code adds an Azure PostgreSQL flexible server resource named `postgres` with a database named `postgresdb`. The `withReference` / `WithReference` call injects the connection information into the consuming project.
## Add a database to an existing server
@@ -133,19 +146,20 @@ var catalogDb = postgres.AddDatabase("catalogdb");
var ordersDb = postgres.AddDatabase("ordersdb");
builder.AddProject("catalog")
- .WithReference(catalogDb)
- .WaitFor(catalogDb);
+.WithReference(catalogDb)
+.WaitFor(catalogDb);
builder.AddProject("orders")
- .WithReference(ordersDb)
- .WaitFor(ordersDb);
+.WithReference(ordersDb)
+.WaitFor(ordersDb);
// After adding all resources, run the app...
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -162,7 +176,8 @@ await builder.addNodeApp("orders", "./orders", "index.js")
.waitFor(ordersDb);
// After adding all resources, run the app...
-```
+````
+
@@ -175,7 +190,7 @@ var postgresdb = postgres.AddDatabase("postgresdb", databaseName: "app_catalog")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const postgresdb = await postgres.addDatabase("postgresdb", { databaseName: "app_catalog" });
```
@@ -191,22 +206,23 @@ The Azure PostgreSQL hosting integration supports running the PostgreSQL server
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
- .RunAsContainer();
+.RunAsContainer();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject("apiservice")
- .WithReference(postgresdb)
- .WaitFor(postgresdb);
+.WithReference(postgresdb)
+.WaitFor(postgresdb);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -220,14 +236,20 @@ await builder.addNodeApp("api", "./api", "index.js")
.waitFor(postgresdb);
// After adding all resources, run the app...
-```
+````
+
When `RunAsContainer` / `runAsContainer` is called, Aspire uses the [`docker.io/library/postgres`](https://hub.docker.com/_/postgres) container image and generates credentials automatically. The same consuming app code and environment variable names work in both local-container and Azure modes.
### Cross-reference: local-container vs Azure PostgreSQL
@@ -249,19 +271,20 @@ var existingPostgresName = builder.AddParameter("existingPostgresName");
var existingPostgresResourceGroup = builder.AddParameter("existingPostgresResourceGroup");
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
- .AsExisting(existingPostgresName, existingPostgresResourceGroup);
+.AsExisting(existingPostgresName, existingPostgresResourceGroup);
builder.AddProject("apiservice")
- .WithReference(postgres);
+.WithReference(postgres);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -269,13 +292,14 @@ const existingPostgresName = await builder.addParameter("existingPostgresName");
const existingPostgresResourceGroup = await builder.addParameter("existingPostgresResourceGroup");
const postgres = await builder.addAzurePostgresFlexibleServer("postgres");
-await postgres.asExisting(existingPostgresName, { resourceGroup: existingPostgresResourceGroup });
+await postgres.asExisting(existingPostgresName, existingPostgresResourceGroup);
await builder.addNodeApp("api", "./api", "index.js")
.withReference(postgres);
// After adding all resources, run the app...
-```
+````
+
@@ -294,22 +318,23 @@ var username = builder.AddParameter("username", secret: true);
var password = builder.AddParameter("password", secret: true);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
- .WithPasswordAuthentication(username, password);
+.WithPasswordAuthentication(username, password);
var postgresdb = postgres.AddDatabase("postgresdb");
builder.AddProject("apiservice")
- .WithReference(postgresdb)
- .WaitFor(postgresdb);
+.WithReference(postgresdb)
+.WaitFor(postgresdb);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -326,14 +351,17 @@ await builder.addNodeApp("api", "./api", "index.js")
.waitFor(postgresdb);
// After adding all resources, run the app...
-```
+````
+
When password authentication is enabled, the `Username` and `Password` connection properties are also injected into consuming apps. See [Connect to Azure PostgreSQL](../azure-postgresql-connect/#connection-properties) for the full property reference.
## Provisioning-generated Bicep
@@ -451,6 +479,13 @@ builder.AddAzurePostgresFlexibleServer("postgres")
builder.Build().Run();
```
+
+
The preceding code:
- Chains a call to the `ConfigureInfrastructure` API:
@@ -468,7 +503,10 @@ There are many more configuration options available to customize the PostgreSQL
When you call `AddDatabase` / `addDatabase` on an Azure PostgreSQL resource, Aspire provisions the database during the **first** deployment. On subsequent deployments with `azd up`, only the server-level Bicep is redeployed — databases that already exist are not recreated or deleted.
If you need to add a new database to an existing server, redeploy your application with the updated AppHost code or manually create the database by using the Azure portal or the PostgreSQL CLI:
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-connect.mdx
index dbde9b361..477204e2d 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Service Bus
+seoTitle: Connect to Azure Service Bus from your .NET app with Aspire
description: Learn how to connect to Azure Service Bus from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-get-started.mdx
index aae3a132e..2ca6ef83c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Service Bus integrations
-description: Understand why you use the Aspire Azure Service Bus integrations and how they fit together.
+description: Understand why you use the Aspire Azure Service Bus integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-host.mdx
index 47d45a9c5..a00f1dbbc 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-service-bus/azure-service-bus-host.mdx
@@ -17,7 +17,7 @@ import serviceBusIcon from '@assets/icons/azure-servicebus-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Service Bus Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Service Bus namespace, queues, topics, and subscriptions as resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Service Bus Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Service Bus namespace, queues, topics, and subscriptions as resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Service Bus integration, start with the [Get started with the Azure Service Bus integrations](/integrations/cloud/azure/azure-service-bus/azure-service-bus-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Service Bus](../azure-service-bus-connect/).
@@ -97,8 +97,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -152,8 +152,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -205,8 +205,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -244,8 +244,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -281,8 +281,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -360,8 +360,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -406,8 +406,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -454,8 +454,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-get-started.mdx
index 5f0c7074a..50c81d866 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure SignalR Service integration
-description: Understand why you use the Aspire Azure SignalR Service integration and how it fits together.
+description: Understand why you use the Aspire Azure SignalR Service integration and how it fits together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-host.mdx
index ac91d9e59..6593b2509 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-signalr/azure-signalr-host.mdx
@@ -17,7 +17,7 @@ import signalrIcon from '@assets/icons/azure-signalr-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure SignalR Service hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure SignalR Service resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure SignalR Service hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure SignalR Service resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure SignalR Service integration, start with the [Get started with the Azure SignalR Service integration](/integrations/cloud/azure/azure-signalr/azure-signalr-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure SignalR Service](../azure-signalr-connect/).
@@ -90,8 +90,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -165,8 +165,8 @@ The available modes are:
The TypeScript `addAzureSignalR` API doesn't expose a service mode parameter. To configure Serverless mode in a TypeScript AppHost, use `configureInfrastructure` to modify the generated Bicep:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -218,8 +218,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -261,8 +261,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -384,8 +384,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-connect.mdx
index f276c654f..8120af5e3 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure SQL Database
+seoTitle: Connect to Azure SQL Database from your .NET app with Aspire
description: Learn how to connect to Azure SQL Database from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-get-started.mdx
index 80c4c3c99..93af903c1 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure SQL Database integrations
-description: Understand why you use the Aspire Azure SQL Database integrations and how they fit together.
+description: Understand why you use the Aspire Azure SQL Database integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-host.mdx
index 61772150c..9357b3604 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-sql-database/azure-sql-database-host.mdx
@@ -17,7 +17,7 @@ import sqlServerIcon from '@assets/icons/azure-sqlserver-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure SQL Database Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure SQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure SQL Database Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure SQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure SQL Database integration, start with the [Get started with Azure SQL Database integrations](/integrations/cloud/azure/azure-sql-database/azure-sql-database-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure SQL Database](../azure-sql-database-connect/). For the Azure SQL Database Entity Framework Core client integration, see [Azure SQL Database EF Core integration](/integrations/databases/efcore/azure-sql/azure-sql-get-started/).
@@ -33,7 +33,8 @@ aspire add azure-sql
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -54,7 +55,8 @@ aspire add azure-sql
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the Azure SQL Database hosting integration package:
@@ -83,15 +85,16 @@ var sql = builder.AddAzureSqlServer("sql");
var db = sql.AddDatabase("database");
var exampleProject = builder.AddProject("apiservice")
- .WithReference(db);
+.WithReference(db);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -103,7 +106,8 @@ await builder.addNodeApp("api", "./api", "index.js")
// After adding all resources, run the app...
await builder.build().run();
-```
+````
+
@@ -118,18 +122,19 @@ await builder.build().run();
## Run Azure SQL server resource as a container
@@ -142,20 +147,21 @@ During local development and testing, you can run an Azure SQL server as a local
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddAzureSqlServer("sql")
- .RunAsContainer();
+.RunAsContainer();
var db = sql.AddDatabase("database");
var exampleProject = builder.AddProject("apiservice")
- .WithReference(db);
+.WithReference(db);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -169,17 +175,19 @@ await builder.addNodeApp("api", "./api", "index.js")
// After adding all resources, run the app...
await builder.build().run();
-```
+````
+
When `RunAsContainer` is active, Aspire pulls a SQL Server container image and runs it locally. The consuming project receives the same connection environment variables it would receive when deployed to Azure, so your code works without modification between local and cloud environments.
## Connect to an existing Azure SQL server
@@ -195,19 +203,20 @@ var existingName = builder.AddParameter("existingSqlServerName");
var existingResourceGroup = builder.AddParameter("existingSqlServerResourceGroup");
var sql = builder.AddAzureSqlServer("sql")
- .AsExisting(existingName, existingResourceGroup)
- .AddDatabase("database");
+.AsExisting(existingName, existingResourceGroup)
+.AddDatabase("database");
builder.AddProject("apiservice")
- .WithReference(sql);
+.WithReference(sql);
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -215,7 +224,7 @@ const existingName = await builder.addParameter("existingSqlServerName");
const existingResourceGroup = await builder.addParameter("existingSqlServerResourceGroup");
const sql = await builder.addAzureSqlServer("sql");
-await sql.asExisting(existingName, { resourceGroup: existingResourceGroup });
+await sql.asExisting(existingName, existingResourceGroup);
const db = await sql.addDatabase("database");
await builder.addNodeApp("api", "./api", "index.js")
@@ -223,7 +232,8 @@ await builder.addNodeApp("api", "./api", "index.js")
// After adding all resources, run the app...
await builder.build().run();
-```
+````
+
@@ -326,6 +336,13 @@ var sql = builder.AddAzureSqlServer("sql")
builder.Build().Run();
```
+
+
The preceding code:
- Chains a call to the `ConfigureInfrastructure` API where the `infra` parameter is an instance of `AzureResourceInfrastructure`.
@@ -362,14 +379,15 @@ Call `ClearDefaultRoleAssignments` (or `clearDefaultRoleAssignments`) to disable
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddAzureSqlServer("sql")
- .ClearDefaultRoleAssignments();
+.ClearDefaultRoleAssignments();
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -377,7 +395,8 @@ const sql = await builder.addAzureSqlServer("sql");
await sql.clearDefaultRoleAssignments();
await builder.build().run();
-```
+````
+
@@ -401,17 +420,18 @@ var peSubnet = vnet.AddSubnet("pe-subnet", "10.0.2.0/24");
var aciSubnet = vnet.AddSubnet("aci-subnet", "10.0.3.0/29");
var sql = builder.AddAzureSqlServer("sql")
- .WithAdminDeploymentScriptSubnet(aciSubnet);
+.WithAdminDeploymentScriptSubnet(aciSubnet);
var db = sql.AddDatabase("database");
peSubnet.AddPrivateEndpoint(sql);
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -426,7 +446,8 @@ const db = await sql.addDatabase("database");
await peSubnet.addPrivateEndpoint(sql);
await builder.build().run();
-```
+````
+
@@ -444,17 +465,18 @@ var peSubnet = vnet.AddSubnet("pe-subnet", "10.0.2.0/24");
var storage = builder.AddAzureStorage("scriptstorage");
var sql = builder.AddAzureSqlServer("sql")
- .WithAdminDeploymentScriptStorage(storage);
+.WithAdminDeploymentScriptStorage(storage);
var db = sql.AddDatabase("database");
peSubnet.AddPrivateEndpoint(sql);
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -469,7 +491,8 @@ const db = await sql.addDatabase("database");
await peSubnet.addPrivateEndpoint(sql);
await builder.build().run();
-```
+````
+
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-connect.mdx
index a0cccd74d..2058ab406 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Blob Storage
+seoTitle: Connect to Azure Blob Storage from your .NET app with Aspire
description: Learn how to connect to Azure Blob Storage from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-get-started.mdx
index 3197fab33..426d1e6c7 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Blob Storage integrations
-description: Understand why you use the Aspire Azure Blob Storage integrations and how they fit together.
+description: Understand why you use the Aspire Azure Blob Storage integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-host.mdx
index de86727b9..73ef8cdcd 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-host.mdx
@@ -19,7 +19,7 @@ import storageExplorerImage from '@assets/integrations/cloud/azure/storage/azure
data-zoom-off
/>
-This article is the reference for the Aspire Azure Blob Storage Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Storage and blob resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Blob Storage Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Storage and blob resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Blob Storage integration, start with the [Get started with Azure Blob Storage integrations](/integrations/cloud/azure/azure-storage-blobs/azure-storage-blobs-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Blob Storage](../azure-storage-blobs-connect/).
@@ -88,8 +88,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -130,8 +130,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -175,8 +175,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -217,8 +217,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -266,8 +266,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -306,8 +306,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -344,8 +344,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -384,8 +384,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -432,8 +432,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -506,8 +506,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureStorageRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureStorageRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -619,8 +619,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-datalake.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-datalake.mdx
index f9dcf6fcc..9c96f7060 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-datalake.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-datalake.mdx
@@ -90,8 +90,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -141,8 +141,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -199,8 +199,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-get-started.mdx
index 2620cb16a..f8dc5c04f 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Queue Storage integrations
-description: Understand why you use the Aspire Azure Queue Storage integrations and how they fit together.
+description: Understand why you use the Aspire Azure Queue Storage integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-host.mdx
index ea077da50..7fe5f7d2c 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-host.mdx
@@ -19,7 +19,7 @@ import storageExplorerImage from '@assets/integrations/cloud/azure/storage/azure
data-zoom-off
/>
-This article is the reference for the Aspire Azure Queue Storage Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Azure Storage account and its queue resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Queue Storage Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Azure Storage account and its queue resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Queue Storage integration, start with the [Get started with Azure Queue Storage integrations](/integrations/cloud/azure/azure-storage-queues/azure-storage-queues-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Queue Storage](../azure-storage-queues-connect/).
@@ -96,8 +96,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -150,8 +150,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -205,8 +205,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -257,8 +257,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -299,8 +299,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -343,8 +343,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -395,8 +395,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-get-started.mdx
index 00b91185d..1e10b5bd6 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Table Storage integrations
-description: Understand why you use the Aspire Azure Table Storage integrations and how they fit together.
+description: Understand why you use the Aspire Azure Table Storage integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-host.mdx
index 9aa9212be..e381a0e8f 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-host.mdx
@@ -18,7 +18,7 @@ import storageExplorerImage from '@assets/integrations/cloud/azure/storage/azure
data-zoom-off
/>
-This article is the reference for the Aspire Azure Table Storage hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Storage accounts and table resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Table Storage hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Storage accounts and table resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Table Storage integration, start with the [Get started with Azure Table Storage integrations](/integrations/cloud/azure/azure-storage-tables/azure-storage-tables-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Table Storage](../azure-storage-tables-connect/).
@@ -92,8 +92,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -153,8 +153,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -205,8 +205,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -254,8 +254,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -292,8 +292,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -332,8 +332,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -409,8 +409,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-virtual-network.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-virtual-network.mdx
index be060a929..18d3e5280 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-virtual-network.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-virtual-network.mdx
@@ -17,7 +17,7 @@ import azureIcon from '@assets/icons/azure-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Virtual Network integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to configure virtual networks, subnets, NAT gateways, network security groups (NSGs), private endpoints, and network security perimeters in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Virtual Network integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to configure virtual networks, subnets, NAT gateways, network security groups (NSGs), private endpoints, and network security perimeters in your [`AppHost`](/get-started/app-host/) project.
[Azure Virtual Network](https://learn.microsoft.com/azure/virtual-network/) enables Azure resources to securely communicate with each other, the internet, and on-premises networks.
@@ -33,10 +33,10 @@ The Azure Virtual Network hosting integration models network resources as the fo
- `AzureNetworkSecurityPerimeterResource`: Represents an Azure Network Security Perimeter for PaaS service isolation.
## Installation
@@ -51,7 +51,8 @@ aspire add azure-network
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
Or, choose a manual installation approach:
@@ -72,7 +73,8 @@ aspire add azure-network
```
- Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the command reference.
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
This updates your `aspire.config.json` with the Azure Network hosting integration package:
@@ -109,11 +111,12 @@ var vnet = builder.AddAzureVirtualNetwork("vnet");
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -121,7 +124,8 @@ const vnet = await builder.addAzureVirtualNetwork("vnet");
// After adding all resources, run the app...
await builder.build().run();
-```
+````
+
@@ -129,14 +133,18 @@ By default, the virtual network uses the address prefix `10.0.0.0/16`. You can s
+
```csharp title="C# — AppHost.cs"
var vnet = builder.AddAzureVirtualNetwork("vnet", "10.1.0.0/16");
```
+
-```typescript title="TypeScript — apphost.ts"
-const vnet = await builder.addAzureVirtualNetwork("vnet", "10.1.0.0/16");
+
+```typescript title="TypeScript — apphost.mts"
+const vnet = await builder.addAzureVirtualNetwork('vnet', '10.1.0.0/16');
```
+
@@ -150,14 +158,16 @@ Call `AddSubnet` (or `addSubnet`) on the virtual network builder to add a subnet
var vnet = builder.AddAzureVirtualNetwork("vnet");
var subnet = vnet.AddSubnet("my-subnet", "10.0.1.0/24");
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const vnet = await builder.addAzureVirtualNetwork("vnet");
const subnet = vnet.addSubnet("my-subnet", "10.0.1.0/24");
-```
+````
+
@@ -174,17 +184,19 @@ var natGateway = builder.AddNatGateway("nat");
var vnet = builder.AddAzureVirtualNetwork("vnet");
var subnet = vnet.AddSubnet("aca-subnet", "10.0.0.0/23")
- .WithNatGateway(natGateway);
-```
+.WithNatGateway(natGateway);
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const natGateway = await builder.addNatGateway("nat");
const vnet = await builder.addAzureVirtualNetwork("vnet");
const subnet = vnet.addSubnet("aca-subnet", "10.0.0.0/23")
.withNatGateway(natGateway);
-```
+````
+
@@ -192,18 +204,21 @@ By default, a public IP address is automatically created for the NAT gateway. To
+
```csharp title="C# — AppHost.cs"
var pip = builder.AddPublicIPAddress("nat-pip");
var natGateway = builder.AddNatGateway("nat")
.WithPublicIPAddress(pip);
```
+
-```typescript title="TypeScript — apphost.ts"
-const pip = await builder.addPublicIPAddress("nat-pip");
-const natGateway = await builder.addNatGateway("nat")
- .withPublicIPAddress(pip);
+
+```typescript title="TypeScript — apphost.mts"
+const pip = await builder.addPublicIPAddress('nat-pip');
+const natGateway = await builder.addNatGateway('nat').withPublicIPAddress(pip);
```
+
@@ -223,21 +238,23 @@ The shorthand API uses fluent methods on subnet builders that automatically crea
var vnet = builder.AddAzureVirtualNetwork("vnet");
var subnet = vnet.AddSubnet("web", "10.0.1.0/24")
- .AllowInbound(
- port: "443",
- from: AzureServiceTags.AzureLoadBalancer,
- protocol: SecurityRuleProtocol.Tcp)
- .DenyInbound(from: AzureServiceTags.Internet);
-```
+.AllowInbound(
+port: "443",
+from: AzureServiceTags.AzureLoadBalancer,
+protocol: SecurityRuleProtocol.Tcp)
+.DenyInbound(from: AzureServiceTags.Internet);
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const vnet = await builder.addAzureVirtualNetwork("vnet");
const subnet = vnet.addSubnet("web", "10.0.1.0/24")
- .allowInbound({ port: "443", from: "AzureLoadBalancer", protocol: "Tcp" })
- .denyInbound({ from: "Internet" });
-```
+ .allowInbound("443", "AzureLoadBalancer", undefined, "Tcp")
+ .denyInbound(undefined, "Internet");
+````
+
@@ -251,10 +268,10 @@ The available shorthand methods are:
Priority auto-increments by 100 (100, 200, 300...) and rule names are auto-generated from the access, direction, port, and source (for example, `allow-inbound-443-AzureLoadBalancer`).
#### Explicit API
@@ -269,23 +286,24 @@ var builder = DistributedApplication.CreateBuilder(args);
var vnet = builder.AddAzureVirtualNetwork("vnet");
var nsg = builder.AddNetworkSecurityGroup("web-nsg")
- .WithSecurityRule(new AzureSecurityRule
- {
- Name = "allow-https",
- Priority = 100,
- Direction = SecurityRuleDirection.Inbound,
- Access = SecurityRuleAccess.Allow,
- Protocol = SecurityRuleProtocol.Tcp,
- DestinationPortRange = "443"
- });
+.WithSecurityRule(new AzureSecurityRule
+{
+Name = "allow-https",
+Priority = 100,
+Direction = SecurityRuleDirection.Inbound,
+Access = SecurityRuleAccess.Allow,
+Protocol = SecurityRuleProtocol.Tcp,
+DestinationPortRange = "443"
+});
var subnet = vnet.AddSubnet("web-subnet", "10.0.1.0/24")
- .WithNetworkSecurityGroup(nsg);
-```
+.WithNetworkSecurityGroup(nsg);
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -303,7 +321,8 @@ const nsg = builder.addNetworkSecurityGroup("web-nsg")
const subnet = vnet.addSubnet("web-subnet", "10.0.1.0/24")
.withNetworkSecurityGroup(nsg);
-```
+````
+
@@ -331,10 +350,11 @@ var storage = builder.AddAzureStorage("storage");
var blobs = storage.AddBlobs("blobs");
peSubnet.AddPrivateEndpoint(blobs);
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const vnet = await builder.addAzureVirtualNetwork("vnet");
const peSubnet = vnet.addSubnet("private-endpoints", "10.0.2.0/24");
@@ -342,7 +362,8 @@ const storage = await builder.addAzureStorage("storage");
const blobs = storage.addBlobs("blobs");
peSubnet.addPrivateEndpoint(blobs);
-```
+````
+
@@ -358,8 +379,9 @@ The private DNS zone ensures that services within the virtual network automatica
#### Override public network access
@@ -376,6 +398,13 @@ storage.ConfigureInfrastructure(infra =>
});
```
+
+
#### Service-specific requirements
##### Azure Service Bus
@@ -391,11 +420,14 @@ storage.ConfigureInfrastructure(infra =>
[Azure Container Registry](/integrations/cloud/azure/azure-container-registry/azure-container-registry-host/) requires the **Premium** SKU to support private endpoints. When you add a private endpoint for an Azure Container Registry resource, Aspire automatically upgrades the SKU to Premium.
### Add a network security perimeter
@@ -423,11 +455,12 @@ var nsp = builder.AddNetworkSecurityPerimeter("my-nsp");
// After adding all resources, run the app...
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -435,7 +468,8 @@ const nsp = await builder.addNetworkSecurityPerimeter("my-nsp");
// After adding all resources, run the app...
await builder.build().run();
-```
+````
+
@@ -462,7 +496,7 @@ var nsp = builder.AddNetworkSecurityPerimeter("my-nsp")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const nsp = await builder.addNetworkSecurityPerimeter("my-nsp")
.withAccessRule({
name: "allow-my-ip",
@@ -480,11 +514,11 @@ const nsp = await builder.addNetworkSecurityPerimeter("my-nsp")
The following properties are available on `AzureNspAccessRule`:
-| Property | Direction | Description |
-|---|---|---|
-| `AddressPrefixes` | Inbound | CIDR ranges allowed to reach the perimeter. |
-| `Subscriptions` | Inbound | Subscription resource IDs (format: `/subscriptions/{id}`) allowed access. |
-| `FullyQualifiedDomainNames` | Outbound | FQDNs that resources inside the perimeter can communicate with. |
+| Property | Direction | Description |
+| --------------------------- | --------- | ------------------------------------------------------------------------- |
+| `AddressPrefixes` | Inbound | CIDR ranges allowed to reach the perimeter. |
+| `Subscriptions` | Inbound | Subscription resource IDs (format: `/subscriptions/{id}`) allowed access. |
+| `FullyQualifiedDomainNames` | Outbound | FQDNs that resources inside the perimeter can communicate with. |
Each property also has a corresponding `*References` variant (for example, `AddressPrefixReferences`) that accepts `ReferenceExpression` values resolved at deploy time.
@@ -504,20 +538,22 @@ Call `WithNetworkSecurityPerimeter` (or `withNetworkSecurityPerimeter`) on a Paa
var nsp = builder.AddNetworkSecurityPerimeter("my-nsp");
var storage = builder.AddAzureStorage("storage")
- .WithNetworkSecurityPerimeter(nsp);
+.WithNetworkSecurityPerimeter(nsp);
var keyVault = builder.AddAzureKeyVault("kv")
- .WithNetworkSecurityPerimeter(nsp);
-```
+.WithNetworkSecurityPerimeter(nsp);
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const nsp = await builder.addNetworkSecurityPerimeter("my-nsp");
const storage = await builder.addAzureStorage("storage")
.withNetworkSecurityPerimeter(nsp);
const keyVault = await builder.addAzureKeyVault("kv")
.withNetworkSecurityPerimeter(nsp);
-```
+````
+
@@ -548,24 +584,26 @@ storage.WithNetworkSecurityPerimeter(nsp);
// Learning mode — logs violations without blocking
keyVault.WithNetworkSecurityPerimeter(
- nsp, NetworkSecurityPerimeterAssociationAccessMode.Learning);
-```
+nsp, NetworkSecurityPerimeterAssociationAccessMode.Learning);
+
+````
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
// Enforced mode (default) — blocks traffic that violates the rules
storage.withNetworkSecurityPerimeter(nsp);
// Learning mode — logs violations without blocking
keyVault.withNetworkSecurityPerimeter(nsp, "Learning");
-```
+````
+
## Complete example
@@ -574,8 +612,8 @@ The following example demonstrates a complete network topology with a virtual ne
@@ -593,30 +631,30 @@ var vnet = builder.AddAzureVirtualNetwork("vnet");
// Container Apps subnet with NSG rules and NAT gateway
var containerAppsSubnet = vnet.AddSubnet("container-apps", "10.0.0.0/23")
- .AllowInbound(
- port: "443",
- from: AzureServiceTags.AzureLoadBalancer,
- protocol: SecurityRuleProtocol.Tcp)
- .DenyInbound(from: AzureServiceTags.VirtualNetwork)
- .DenyInbound(from: AzureServiceTags.Internet);
+.AllowInbound(
+port: "443",
+from: AzureServiceTags.AzureLoadBalancer,
+protocol: SecurityRuleProtocol.Tcp)
+.DenyInbound(from: AzureServiceTags.VirtualNetwork)
+.DenyInbound(from: AzureServiceTags.Internet);
var natGateway = builder.AddNatGateway("nat");
containerAppsSubnet.WithNatGateway(natGateway);
// Private endpoints subnet
var peSubnet = vnet.AddSubnet("private-endpoints", "10.0.2.0/27")
- .AllowInbound(
- port: "443",
- from: AzureServiceTags.VirtualNetwork,
- protocol: SecurityRuleProtocol.Tcp)
- .DenyInbound(from: AzureServiceTags.Internet);
+.AllowInbound(
+port: "443",
+from: AzureServiceTags.VirtualNetwork,
+protocol: SecurityRuleProtocol.Tcp)
+.DenyInbound(from: AzureServiceTags.Internet);
// Configure the Container App Environment to use the VNet.
// WithDelegatedSubnet assigns the subnet to the ACA environment,
// enabling subnet delegation so ACA can inject its infrastructure.
// For more information, see: https://learn.microsoft.com/azure/container-apps/custom-virtual-networks
builder.AddAzureContainerAppEnvironment("env")
- .WithDelegatedSubnet(containerAppsSubnet);
+.WithDelegatedSubnet(containerAppsSubnet);
// Add storage with private endpoints
var storage = builder.AddAzureStorage("storage");
@@ -627,16 +665,17 @@ peSubnet.AddPrivateEndpoint(blobs);
peSubnet.AddPrivateEndpoint(queues);
builder.AddProject("api")
- .WithExternalHttpEndpoints()
- .WithReference(blobs)
- .WithReference(queues);
+.WithExternalHttpEndpoints()
+.WithReference(blobs)
+.WithReference(queues);
builder.Build().Run();
-```
+
+````
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -675,7 +714,8 @@ await builder.addProject("api", "../Api/Api.csproj")
.withReference(queues);
await builder.build().run();
-```
+````
+
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-connect.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-connect.mdx
index ec62b1126..3dbc3dfae 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Azure Web PubSub
+seoTitle: Connect to Azure Web PubSub from your .NET app with Aspire
description: Learn how to connect to Azure Web PubSub from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-get-started.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-get-started.mdx
index 58b4bf925..359f40bc8 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure Web PubSub integrations
-description: Understand why you use the Aspire Azure Web PubSub integrations and how they fit together.
+description: Understand why you use the Aspire Azure Web PubSub integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-host.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-host.mdx
index 26db45cc2..a7dc8036a 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-host.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-host.mdx
@@ -17,7 +17,7 @@ import webPubSubIcon from '@assets/icons/azure-webpubsub-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure Web PubSub hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure Web PubSub resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure Web PubSub hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure Web PubSub resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure Web PubSub integration, start with the [Get started with the Azure Web PubSub integrations](/integrations/cloud/azure/azure-web-pubsub/azure-web-pubsub-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Azure Web PubSub](../azure-web-pubsub-connect/).
@@ -88,8 +88,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -139,8 +139,8 @@ var messagesHub = webPubSub.AddHub(name: "messages", hubName: "messageHub");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -177,8 +177,8 @@ messagesHub.AddEventHandler(
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -222,8 +222,8 @@ builder.AddAzureWebPubSub("web-pubsub")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureWebPubSubRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureWebPubSubRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -271,8 +271,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -402,8 +402,8 @@ builder.AddAzureWebPubSub("web-pubsub")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx
index af9ee1242..78c1ad64e 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/configure-container-apps.mdx
@@ -1,6 +1,6 @@
---
title: Configure Azure Container Apps environments
-description: Learn how to configure Azure Container Apps environment settings for Aspire deployments.
+description: Learn how to configure Azure Container Apps environment settings, scaling rules, and ingress for Aspire AppHost projects deployed to Azure.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
@@ -61,8 +61,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -190,6 +190,133 @@ This module configures:
Using the `acaEnv` variable, you can chain a call to the `ConfigureInfrastructure` API to customize the ACA environment to your liking. For more information, see [Configure infrastructure](/integrations/cloud/azure/customize-resources/).
+## Use an existing ACA environment
+
+If you've already provisioned an Azure Container Apps environment, chain `AsExisting` (or `asExisting`) on `AddAzureContainerAppEnvironment` to deploy your container apps into it instead of creating a new one:
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var existingEnvName = builder.AddParameter("existingEnvName");
+var existingEnvResourceGroup = builder.AddParameter("existingEnvResourceGroup");
+
+var acaEnv = builder.AddAzureContainerAppEnvironment("aca-env")
+ .AsExisting(existingEnvName, existingEnvResourceGroup);
+
+builder.AddProject("api");
+
+builder.Build().Run();
+```
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const existingEnvName = await builder.addParameter("existingEnvName");
+const existingEnvResourceGroup = await builder.addParameter("existingEnvResourceGroup");
+
+const acaEnv = await builder.addAzureContainerAppEnvironment("aca-env");
+await acaEnv.asExisting(existingEnvName, { resourceGroup: existingEnvResourceGroup });
+
+await builder.addProject("api", "../ApiService/ApiService.csproj");
+
+await builder.build().run();
+```
+
+
+
+When the environment is marked as existing, Aspire generates a thin Bicep module that references the existing managed environment by name. It does not emit a new managed environment, Log Analytics workspace, or Aspire Dashboard component — the existing environment already owns those. For background on the `AsExisting` family of APIs, see [Use existing Azure resources](/integrations/cloud/azure/overview/#use-existing-azure-resources).
+
+Some configurations are incompatible with an existing environment and are rejected at publish time:
+
+- `WithDelegatedSubnet` — VNet integration is a property of the managed environment and can't be reconfigured on an existing one.
+- `WithAzureLogAnalyticsWorkspace` — the existing environment already owns its workspace.
+- Volume mounts on container apps targeting the environment — Azure Files storage attaches to the managed environment, which Aspire can't change on an existing environment.
+
+### Bring your own ACR pull identity
+
+By default, even when the environment is existing, Aspire still emits a new user-assigned managed identity and an `AcrPull` role assignment on the container registry so that newly deployed container apps can pull their images. If your deployment principal can't create identities or role assignments, or if you have an existing identity that you want to reuse, supply a pre-existing identity with `WithAcrPullIdentity` (or `withAcrPullIdentity`):
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var existingEnvName = builder.AddParameter("existingEnvName");
+var existingAcrName = builder.AddParameter("existingAcrName");
+var existingIdentityName = builder.AddParameter("existingIdentityName");
+var existingResourceGroup = builder.AddParameter("existingResourceGroup");
+
+var acr = builder.AddAzureContainerRegistry("acr")
+ .AsExisting(existingAcrName, existingResourceGroup);
+
+var pullIdentity = builder.AddAzureUserAssignedIdentity("acr-pull")
+ .AsExisting(existingIdentityName, existingResourceGroup);
+
+builder.AddAzureContainerAppEnvironment("aca-env")
+ .AsExisting(existingEnvName, existingResourceGroup)
+ .WithAzureContainerRegistry(acr)
+ .WithAcrPullIdentity(pullIdentity);
+
+builder.AddProject("api");
+
+builder.Build().Run();
+```
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const existingEnvName = await builder.addParameter("existingEnvName");
+const existingAcrName = await builder.addParameter("existingAcrName");
+const existingIdentityName = await builder.addParameter("existingIdentityName");
+const existingResourceGroup = await builder.addParameter("existingResourceGroup");
+
+const acr = await builder.addAzureContainerRegistry("acr");
+await acr.asExisting(existingAcrName, { resourceGroup: existingResourceGroup });
+
+const pullIdentity = await builder.addAzureUserAssignedIdentity("acr-pull");
+await pullIdentity.asExisting(existingIdentityName, { resourceGroup: existingResourceGroup });
+
+const acaEnv = await builder.addAzureContainerAppEnvironment("aca-env");
+await acaEnv.asExisting(existingEnvName, { resourceGroup: existingResourceGroup });
+await acaEnv.withAzureContainerRegistry(acr);
+await acaEnv.withAcrPullIdentity(pullIdentity);
+
+await builder.addProject("api", "../ApiService/ApiService.csproj");
+
+await builder.build().run();
+```
+
+
+
+:::caution[You own the role assignment]
+The supplied identity must already have the `AcrPull` role on the registry. Aspire does not create that role assignment when you use `WithAcrPullIdentity` — you own the identity's role wiring (for example, by chaining `.WithRoleAssignments(acr, ContainerRegistryBuiltInRole.AcrPull)` when you add the identity).
+:::
+
+### Combinations and what gets emitted
+
+The environment, container registry, and ACR pull identity can each independently be new or existing. The combination determines whether Aspire emits new resources alongside the references to existing ones:
+
+| Environment | Container registry | Pull identity (`WithAcrPullIdentity`) | What gets emitted beyond references |
+|-------------|--------------------|---------------------------------------|---------------------------------------------|
+| New | New (default or user-added) | Not supplied | New environment, Log Analytics, Aspire Dashboard, identity, `AcrPull` role assignment |
+| New | New | Supplied | New environment, Log Analytics, Aspire Dashboard. No identity or role assignment in the env module — wire the role on the identity yourself |
+| New | Existing | Not supplied | New environment, Log Analytics, Aspire Dashboard, identity, `AcrPull` role assignment on existing registry |
+| New | Existing | Supplied | New environment, Log Analytics, Aspire Dashboard. No identity or role assignment in the env module |
+| Existing | New | Not supplied | New identity, new registry, `AcrPull` role assignment |
+| Existing | New | Supplied | New registry. No identity or role assignment in the env module |
+| Existing | Existing | Not supplied | New identity, `AcrPull` role assignment on existing registry |
+| Existing | Existing | Supplied | Nothing — only references to existing resources |
+
+The last row is the only configuration in which the env module emits no new identities, role assignments, or supporting resources. Use it when you already have all of the necessary resources provisioned.
+
## Use PublishAsAzureContainerApp
The following `PublishAsAzureContainerApp` overloads let you customize the generated Container App resource for a project, container, or executable:
@@ -251,8 +378,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/container-app-jobs.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/container-app-jobs.mdx
index de7729d76..9ab525901 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/container-app-jobs.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/container-app-jobs.mdx
@@ -18,10 +18,6 @@ import containerAppsIcon from '@assets/icons/azure-container-apps-environments.s
[Azure Container Apps jobs](https://learn.microsoft.com/azure/container-apps/jobs) let you run containerized tasks that execute for a finite duration and exit. Unlike continuously-running Container Apps, jobs are purpose-built for batch processing, scheduled tasks, and event-driven workloads. The Aspire Azure Container App Jobs hosting integration exposes `PublishAsAzureContainerAppJob` and `PublishAsScheduledAzureContainerAppJob` extension methods so you can declare any `ProjectResource`, `ContainerResource`, or `ExecutableResource` as an Azure Container App Job directly from your [`AppHost`](/get-started/app-host/).
-
-
## Supported resource types
The following resource types can be published as Azure Container App Jobs:
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/customize-resources.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/customize-resources.mdx
index 8f408f284..53f3ca236 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/customize-resources.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/customize-resources.mdx
@@ -44,8 +44,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -83,8 +83,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -118,8 +118,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -185,8 +185,8 @@ builder.Build().Run();
customization.
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -534,8 +534,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/local-provisioning.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/local-provisioning.mdx
index 6ba9275c8..090e505aa 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/local-provisioning.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/local-provisioning.mdx
@@ -1,6 +1,6 @@
---
title: Local Azure provisioning
-description: Learn how to automatically provision Azure resources during local development with Aspire.
+description: Learn how to automatically provision Azure resources during local development with Aspire in your Aspire AppHost.
---
import { Image } from 'astro:assets';
@@ -162,8 +162,8 @@ builder.AddProject("webapp")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/overview.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/overview.mdx
index 6ea0953de..00d3de876 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/overview.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/overview.mdx
@@ -167,8 +167,8 @@ serviceBus.AddServiceBusQueue("queue");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -214,8 +214,8 @@ serviceBus.AddServiceBusQueue("queue");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -301,8 +301,8 @@ serviceBus.AddServiceBusQueue("queue");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -351,8 +351,8 @@ builder.AddProject("api")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/role-assignments.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/role-assignments.mdx
index 4ab0bb2c7..49ecc6776 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/role-assignments.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/role-assignments.mdx
@@ -1,10 +1,10 @@
---
title: Manage Azure role assignments
-description: Learn how to configure Azure role-based access control (RBAC) for Aspire applications.
+description: Learn how to configure Azure role-based access control (RBAC) for Aspire AppHost projects so resources get the minimum permissions they need.
---
import { Image } from 'astro:assets';
-import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
+import { Tabs, TabItem } from '@astrojs/starlight/components';
import azureIcon from '@assets/icons/azure-icon.png';
-Role assignment APIs (`WithRoleAssignments`) are currently only available in the C# AppHost. TypeScript AppHost support is not yet implemented.
-
-
## Default built-in role assignments
When you add an Azure resource to the [AppHost](/get-started/app-host/), it's assigned default roles. If a resource depends on another resource, it inherits the same role assignments as the referenced resource unless explicitly overridden.
@@ -36,13 +32,23 @@ var builder = DistributedApplication.CreateBuilder(args);
var search = builder.AddAzureSearch("search");
var api = builder.AddProject("api")
- .WithReference(search);
-```
+.WithReference(search);
+
+````
-
+
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const search = await builder.addAzureSearch("search");
+
+const api = await builder.addProject("api", "../Api/Api.csproj");
+await api.withReference(search);
+````
+
@@ -65,14 +71,25 @@ var builder = DistributedApplication.CreateBuilder(args);
var search = builder.AddAzureSearch("search");
var api = builder.AddProject("api")
- .WithRoleAssignments(search, SearchBuiltInRole.SearchIndexDataReader)
- .WithReference(search);
-```
+.WithRoleAssignments(search, SearchBuiltInRole.SearchIndexDataReader)
+.WithReference(search);
+
+````
-
+
+```typescript title="TypeScript — apphost.mts" twoslash
+import { AzureSearchRole, createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const search = await builder.addAzureSearch("search");
+
+const api = await builder.addProject("api", "../Api/Api.csproj");
+await api.withRoleAssignments(search, [AzureSearchRole.SearchIndexDataReader]);
+await api.withReference(search);
+````
+
@@ -82,6 +99,59 @@ When you replace the default role assignments with the `SearchIndexDataReader` r
For more information, see [Azure built-in roles](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles).
+## Inspect role assignments programmatically
+
+Aspire represents each set of role assignments as an `AzureRoleAssignmentResource` in the distributed application model. You can enumerate these resources to inspect what role assignments are configured, which Azure resource they target, and which Aspire resource owns them. This is useful in [pipeline steps](/deployment/pipelines/) that need to reason about security configuration before deployment.
+
+`AzureRoleAssignmentResource` exposes three properties:
+
+| Property | Type | Description |
+| --------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TargetAzureResource` | `AzureProvisioningResource` | The Azure resource that the roles are assigned on (the scope, for example, a Key Vault or Storage account). |
+| `OwnerResource` | `IResource?` | The Aspire resource whose managed identity receives the role assignments (the resource on which `WithRoleAssignments` was called). `null` for global role assignments granted to the deployment principal. |
+| `IdentityResource` | `AzureUserAssignedIdentityResource?` | The user-assigned managed identity whose principal receives the role assignments. `null` for global role assignments granted to the deployment principal. |
+
+The following example shows how to add a pipeline step that runs during `WellKnownPipelineSteps.BeforeStart` and enumerates all `AzureRoleAssignmentResource` instances that target a specific Azure resource:
+
+```csharp title="AppHost.cs"
+#pragma warning disable ASPIREAZURE001 // AzureEnvironmentResource is Experimental
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+var keyVault = builder.AddAzureKeyVault("vault");
+
+builder.AddProject("api")
+ .WithReference(keyVault);
+
+builder.Pipeline.AddStep(
+ "inspect-role-assignments",
+ async context =>
+ {
+ var roleAssignments = context.Model.Resources
+ .OfType()
+ .Where(r => r.TargetAzureResource == keyVault.Resource)
+ .ToList();
+
+ foreach (var ra in roleAssignments)
+ {
+ Console.WriteLine($"Owner: {ra.OwnerResource?.Name}, Identity: {ra.IdentityResource?.Name}");
+ }
+ },
+ dependsOn: AzureEnvironmentResource.PrepareResourcesStepName,
+ requiredBy: WellKnownPipelineSteps.BeforeStart);
+
+builder.Build().Run();
+```
+
+:::note
+TypeScript AppHost support for inspecting role assignments through pipeline
+steps isn't yet available.
+:::
+
+:::note
+`OwnerResource` and `IdentityResource` are both `null` for global role assignments granted to the deployment principal. When either property is non-`null`, both are non-`null`.
+:::
+
## Built-in role assignment reference
All built-in roles are defined within the `Azure.Provisioning` namespaces and are included in the corresponding [📦 Azure.Provisioning.\*](https://www.nuget.org/packages?q=Azure.Provisioning) NuGet packages. Each Aspire Azure hosting integration automatically depends on the appropriate provisioning package. For more information, see [Customized Azure resources](/integrations/cloud/azure/customize-resources/).
diff --git a/src/frontend/src/content/docs/integrations/cloud/azure/user-assigned-identity.mdx b/src/frontend/src/content/docs/integrations/cloud/azure/user-assigned-identity.mdx
index 1303d6374..a53b0846d 100644
--- a/src/frontend/src/content/docs/integrations/cloud/azure/user-assigned-identity.mdx
+++ b/src/frontend/src/content/docs/integrations/cloud/azure/user-assigned-identity.mdx
@@ -1,6 +1,6 @@
---
title: User-assigned managed identity
-description: Learn how to configure user-assigned managed identities for Aspire applications in Azure.
+description: Learn how to configure user-assigned managed identities for Aspire AppHost resources so deployed apps authenticate to Azure without secrets.
---
import { Image } from 'astro:assets';
@@ -16,7 +16,7 @@ import azureIcon from '@assets/icons/azure-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Azure user-assigned managed identity (UMI) support. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to add, reference, and assign roles to user-assigned managed identities in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Azure user-assigned managed identity (UMI) support. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to add, reference, and assign roles to user-assigned managed identities in your [`AppHost`](/get-started/app-host/) project.
A user-assigned managed identity is a standalone Azure resource that you assign to one or more Azure service resources, giving you explicit control over identity management and resource access.
@@ -39,8 +39,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -86,8 +86,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -128,8 +128,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, AzureKeyVaultRole } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, AzureKeyVaultRole } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/compute/docker.mdx b/src/frontend/src/content/docs/integrations/compute/docker.mdx
index 56b6833b5..c0332347f 100644
--- a/src/frontend/src/content/docs/integrations/compute/docker.mdx
+++ b/src/frontend/src/content/docs/integrations/compute/docker.mdx
@@ -1,5 +1,6 @@
---
title: Docker integration
+seoTitle: Aspire Docker integration for containerized resources
description: Learn how to use the Aspire Docker hosting integration to deploy your app with Docker Compose.
---
@@ -102,8 +103,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -142,9 +143,29 @@ The preceding code:
When a Docker Compose environment is present, all resources are automatically published as Docker Compose services — no additional opt-in is required.
### Add Docker Compose environment resource with properties
@@ -162,8 +183,8 @@ builder.AddDockerComposeEnvironment("compose")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -197,8 +218,8 @@ builder.AddDockerComposeEnvironment("compose")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -238,8 +259,8 @@ builder.AddDockerComposeEnvironment("compose")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -277,8 +298,8 @@ var apiHost = compose.Resource.GetHostAddressExpression(
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -322,8 +343,8 @@ builder.AddDockerComposeEnvironment("compose")
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -371,8 +392,8 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -434,9 +455,9 @@ builder.Build().Run();
```
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import type { DockerfileBuilderCallbackContext } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -489,8 +510,8 @@ builder.AddContainer("mycontainer", "myimage:latest")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, ImagePullPolicy } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, ImagePullPolicy } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -516,8 +537,8 @@ builder.AddContainer("myapp", "my-local-image:dev")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder, ImagePullPolicy } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder, ImagePullPolicy } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -572,8 +593,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -686,8 +707,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -738,8 +759,8 @@ var api = builder.AddProject("api")
```
-```typescript title="apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/compute/kubernetes.mdx b/src/frontend/src/content/docs/integrations/compute/kubernetes.mdx
index 4a12e81be..e58971547 100644
--- a/src/frontend/src/content/docs/integrations/compute/kubernetes.mdx
+++ b/src/frontend/src/content/docs/integrations/compute/kubernetes.mdx
@@ -1,5 +1,6 @@
---
title: Kubernetes integration
+seoTitle: "Kubernetes integration for Aspire: hosting and client wiring"
description: Learn how to add Kubernetes deployment support to your Aspire application using the Aspire.Hosting.Kubernetes hosting integration.
---
@@ -17,7 +18,7 @@ import kubernetesIcon from '@assets/icons/kubernetes.svg';
data-zoom-off
/>
-This article is the reference for the Aspire Kubernetes hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Kubernetes environment resources in your [`AppHost`](/get-started/app-host/) project. The integration enables you to publish and deploy your Aspire application to any Kubernetes cluster, generating Helm charts from your application model or deploying directly to a cluster using your current `kubectl` context.
+This article is the reference for the Aspire Kubernetes hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Kubernetes environment resources in your [`AppHost`](/get-started/app-host/) project. The integration enables you to publish and deploy your Aspire application to any Kubernetes cluster, generating Helm charts from your application model or deploying directly to a cluster using your current `kubectl` context.
## Installation
@@ -88,8 +89,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -107,9 +108,29 @@ await builder.build().run();
## Configure Helm chart options
@@ -134,7 +155,7 @@ builder.AddKubernetesEnvironment("k8s")
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const k8s = await builder.addKubernetesEnvironment('k8s');
await k8s.withHelm(async (helm) => {
await helm.withNamespace('my-namespace');
@@ -175,7 +196,7 @@ builder.AddKubernetesEnvironment("k8s").WithContainerRegistry(registry);
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const registry = await builder.addContainerRegistry('registry', 'myregistry.example.com:5000');
const k8s = await builder.addKubernetesEnvironment('k8s');
await k8s.withContainerRegistry(registry);
@@ -212,7 +233,7 @@ builder.AddContainer("service", "nginx")
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
const service = await builder.addContainer('service', 'nginx');
await service.publishAsKubernetesService(async (resource) => {
// Scale to 3 replicas
@@ -223,6 +244,105 @@ await service.publishAsKubernetesService(async (resource) => {
+## Add custom Kubernetes manifests
+
+Within a `PublishAsKubernetesService` callback, you can attach arbitrary Kubernetes manifests — such as [cert-manager](https://cert-manager.io/) `Certificate` definitions, additional `ConfigMap` objects, or any other Kubernetes resource — to the generated Helm chart alongside your service.
+
+The API surface differs by language:
+
+- **C#**: add subclasses of `BaseKubernetesResource` directly to the `AdditionalResources` collection. Several built-in types (such as `ConfigMap`) are available in the `Aspire.Hosting.Kubernetes.Resources` namespace, and you can subclass `BaseKubernetesResource` to model any custom resource definition (CRD).
+- **TypeScript**: call `addManifest` on the resource. It takes the manifest's `apiVersion`, `kind`, and `metadata.name`, and returns a handle for setting labels, annotations, a namespace, and arbitrary field values using dot-notation paths.
+
+
+
+
+Define a class for the custom resource by deriving from `BaseKubernetesResource`, then add an instance to `AdditionalResources`. The example below models a cert-manager `Certificate` CRD:
+
+```csharp title="AppHost.cs"
+using Aspire.Hosting.Kubernetes.Resources;
+using YamlDotNet.Serialization;
+
+builder.AddContainer("service", "nginx")
+ .PublishAsKubernetesService(resource =>
+ {
+ var certificate = new Certificate
+ {
+ Metadata = { Name = "service-tls" },
+ Spec =
+ {
+ SecretName = "service-tls",
+ DnsNames = { "service.example.com" },
+ IssuerRef = { Name = "letsencrypt-prod", Kind = "ClusterIssuer" },
+ },
+ };
+ certificate.Metadata.Labels["example.com/managed-by"] = "aspire";
+ resource.AdditionalResources.Add(certificate);
+ });
+
+public sealed class Certificate() : BaseKubernetesResource("cert-manager.io/v1", "Certificate")
+{
+ [YamlMember(Alias = "spec")]
+ public CertificateSpec Spec { get; set; } = new();
+}
+
+public sealed class CertificateSpec
+{
+ [YamlMember(Alias = "secretName")]
+ public string SecretName { get; set; } = "";
+
+ [YamlMember(Alias = "dnsNames")]
+ public List DnsNames { get; } = [];
+
+ [YamlMember(Alias = "issuerRef")]
+ public IssuerRef IssuerRef { get; set; } = new();
+}
+
+public sealed class IssuerRef
+{
+ [YamlMember(Alias = "name")]
+ public string Name { get; set; } = "";
+
+ [YamlMember(Alias = "kind")]
+ public string Kind { get; set; } = "Issuer";
+}
+```
+
+For simple cases that map to a built-in type, instantiate the type directly — for example, `new ConfigMap { Metadata = { Name = "extra-config" }, Data = { ["key"] = "value" } }` — and add it to `AdditionalResources`.
+
+
+
+```typescript title="apphost.ts"
+const service = await builder.addContainer('service', 'nginx');
+await service.publishAsKubernetesService(async (resource) => {
+ await resource.addManifest('cert-manager.io/v1', 'Certificate', 'service-tls', {
+ configure: async (manifest) => {
+ await manifest.withLabel('example.com/managed-by', 'aspire');
+ await manifest.withField('spec.secretName', 'service-tls');
+ await manifest.withField('spec.dnsNames', ['service.example.com']);
+ await manifest.withField('spec.issuerRef.name', 'letsencrypt-prod');
+ await manifest.withField('spec.issuerRef.kind', 'ClusterIssuer');
+ },
+ });
+});
+```
+
+
+
+The manifest handle returned by `addManifest` supports the following configuration methods:
+
+| Method | Description |
+|---|---|
+| `withNamespace` | Sets the Kubernetes namespace for the manifest. |
+| `withLabel` | Adds a metadata label to the manifest. |
+| `withAnnotation` | Adds a metadata annotation to the manifest. |
+| `withField` | Sets an arbitrary field using a dot-notation path (for example, `spec.maxReplicaCount`). |
+
+Each manifest is emitted as a separate template file inside the generated Helm chart.
+
+
+
## Publishing and deployment
The Kubernetes integration supports both [`aspire publish`](/reference/cli/commands/aspire-publish/) (generate Helm chart artifacts) and [`aspire deploy`](/reference/cli/commands/aspire-deploy/) (deploy directly to your current cluster context).
diff --git a/src/frontend/src/content/docs/integrations/custom-integrations/client-integrations.mdx b/src/frontend/src/content/docs/integrations/custom-integrations/client-integrations.mdx
index 3c0d6019d..1ca0d4d41 100644
--- a/src/frontend/src/content/docs/integrations/custom-integrations/client-integrations.mdx
+++ b/src/frontend/src/content/docs/integrations/custom-integrations/client-integrations.mdx
@@ -1,6 +1,6 @@
---
title: Create custom client integrations
-description: Learn how to create a custom Aspire client integration for an existing containerized application.
+description: Learn how to create a custom Aspire client integration for an existing containerized application in your Aspire AppHost.
---
import { Aside, Badge, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/integrations/custom-integrations/hosting-integrations.mdx b/src/frontend/src/content/docs/integrations/custom-integrations/hosting-integrations.mdx
index b09fdfd84..3f2ea2722 100644
--- a/src/frontend/src/content/docs/integrations/custom-integrations/hosting-integrations.mdx
+++ b/src/frontend/src/content/docs/integrations/custom-integrations/hosting-integrations.mdx
@@ -1,6 +1,6 @@
---
title: Create custom hosting integrations
-description: Learn how to create a custom Aspire hosting integration for an existing containerized application.
+description: Learn how to create a custom Aspire hosting integration for an existing containerized application in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/custom-integrations/secure-communication.mdx b/src/frontend/src/content/docs/integrations/custom-integrations/secure-communication.mdx
index 5192f9a62..a86a59183 100644
--- a/src/frontend/src/content/docs/integrations/custom-integrations/secure-communication.mdx
+++ b/src/frontend/src/content/docs/integrations/custom-integrations/secure-communication.mdx
@@ -1,6 +1,6 @@
---
title: Secure communication between integrations
-description: Learn how to secure communication between hosting and client integrations.
+description: Learn how to secure communication between Aspire hosting and client integrations with HTTPS, mutual TLS, secret-backed parameters, and managed identities in production.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-connect.mdx b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-connect.mdx
index 8e050a1d2..5cdf40ce9 100644
--- a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-connect.mdx
@@ -1,6 +1,7 @@
---
title: Connect to ClickHouse
-description: Learn how to connect to ClickHouse from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
+seoTitle: Connect to ClickHouse from your .NET app with Aspire
+description: "Learn how to connect to ClickHouse from C#, Go, Python, and TypeScript consuming apps in an Aspire solution in your Aspire AppHost."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-get-started.mdx
index 97f47f3f0..ca50aa747 100644
--- a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the ClickHouse integrations
-description: Understand why you use the Aspire ClickHouse integrations and how they fit together.
+description: Learn how the Aspire ClickHouse integrations host a ClickHouse analytics database resource and configure the .NET client for fast OLAP queries.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-host.mdx b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-host.mdx
index 1262c7517..33524689a 100644
--- a/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/clickhouse/clickhouse-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up ClickHouse in the AppHost
+seoTitle: "Set up ClickHouse in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire ClickHouse Hosting integration to orchestrate and configure a ClickHouse database in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-get-started.mdx
index 7a20b028d..dfa37ac3c 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-get-started.mdx
@@ -1,6 +1,6 @@
---
-title: Get started with the EF Core Azure Cosmos DB integrations
-description: Understand why you use the Aspire EF Core Azure Cosmos DB integrations and how they fit together.
+title: EF Core Azure Cosmos DB integrations overview
+description: "Use the Aspire Entity Framework Core Azure Cosmos DB integrations to model your DbContext, provision a Cosmos DB account, and connect from C# apps with health checks."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-host.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-host.mdx
index 8bf2e2c9b..3dc7879ae 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-host.mdx
@@ -93,8 +93,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db");
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -130,8 +130,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -175,8 +175,8 @@ var cosmos = builder.AddAzureCosmosDB("cosmos-db")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/azure-postgresql/azure-postgresql-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/azure-postgresql/azure-postgresql-get-started.mdx
index 916ac49ee..d183a992d 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/azure-postgresql/azure-postgresql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/azure-postgresql/azure-postgresql-get-started.mdx
@@ -1,6 +1,6 @@
---
-title: Get started with the Azure PostgreSQL EF Core integrations
-description: Understand why you use the Aspire Azure PostgreSQL EF Core integrations and how they fit together.
+title: EF Core Azure PostgreSQL integrations overview
+description: "Use the Aspire EF Core Azure PostgreSQL hosting and client integrations to provision flexible servers and connect from your C# DbContext with resilience and telemetry."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-get-started.mdx
index 5ce516998..75fba62fb 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Azure SQL EF Core integrations
-description: Understand why you use the Aspire Azure SQL EF Core integrations and how they fit together.
+description: Understand why you use the Aspire Azure SQL EF Core integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-host.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-host.mdx
index 481cdcb1e..d469d8b25 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/azure-sql/azure-sql-host.mdx
@@ -18,7 +18,7 @@ import sqlServerIcon from '@assets/icons/azure-sqlserver-icon.png';
data-zoom-off
/>
-This article is the hosting integration reference for the Aspire Azure SQL EF Core integration set. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Azure SQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the hosting integration reference for the Aspire Azure SQL EF Core integration set. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Azure SQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Azure SQL EF Core integration, start with the [Get started with Azure SQL EF Core integrations](/integrations/databases/efcore/azure-sql/azure-sql-get-started/) guide. For how consuming C# apps connect using Entity Framework Core, see [Connect to Azure SQL with EF Core](../azure-sql-connect/). For the full cloud-focused hosting reference — including provisioned Bicep, admin deployment scripts, private endpoints, and multi-language connection examples — see [Set up Azure SQL Database in the AppHost](/integrations/cloud/azure/azure-sql-database/azure-sql-database-host/).
@@ -91,8 +91,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -154,8 +154,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -199,8 +199,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-connect.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-connect.mdx
index e9da30b58..c7e80fcfa 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-connect.mdx
@@ -1,6 +1,6 @@
---
title: MongoDB EF Core client integration
-description: Learn how to use the MongoDB EF Core client integration to interact with MongoDB instances.
+description: Learn how to use the MongoDB EF Core client integration to interact with MongoDB instances in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-get-started.mdx
index 032744537..16be8a22f 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/mongodb/mongodb-efcore-get-started.mdx
@@ -1,6 +1,6 @@
---
-title: Get started with the MongoDB Entity Framework Core integrations
-description: Understand why you use the Aspire MongoDB EF Core integrations and how they fit together.
+title: MongoDB EF Core integrations overview
+description: "Use the Aspire MongoDB Entity Framework Core integrations to host a Mongo container, share a connection string, and bind a C# DbContext with health checks and tracing."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-connect.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-connect.mdx
index c874115d2..de6e8aec5 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to MySQL with EF Core
+seoTitle: Connect to MySQL with EF Core from your .NET app with Aspire
description: Learn how to register an EF Core DbContext for MySQL from a C# consuming app in an Aspire solution, including connection properties, configuration, health checks, and telemetry.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-get-started.mdx
index bc348c204..f802562f0 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/mysql/mysql-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the MySQL EF Core integration
-description: Understand why you use the Aspire MySQL Pomelo Entity Framework Core integration and how it fits together.
+description: Understand why you use the Aspire MySQL Pomelo Entity Framework Core integration and how it fits together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-get-started.mdx
index 9806687a7..a482e29d4 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Oracle EF Core integrations
-description: Understand why you use the Aspire Oracle EF Core integrations and how they fit together.
+description: Learn how the Aspire Oracle EF Core integrations host an Oracle database resource and register the Entity Framework Core DbContext for your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-host.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-host.mdx
index 27aac4394..698208b5f 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/oracle/oracle-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Oracle in the AppHost
+seoTitle: "Set up Oracle in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Oracle Hosting integration to orchestrate and configure an Oracle database in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/postgres/postgresql-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/postgres/postgresql-get-started.mdx
index 88490beb9..6766ebc4a 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/postgres/postgresql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/postgres/postgresql-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the PostgreSQL EF Core integrations
-description: Understand why you use the Aspire PostgreSQL EF Core integrations and how they fit together.
+description: Understand why you use the Aspire PostgreSQL EF Core integrations and how they fit together in your Aspire AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-connect.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-connect.mdx
index 75c0843fc..f19aefe31 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-connect.mdx
@@ -1,6 +1,6 @@
---
title: Connect to SQL Server (EF Core)
-description: Learn how to connect to SQL Server from C# consuming apps using Entity Framework Core in an Aspire solution.
+description: "Learn how to connect to SQL Server from C# consuming apps using Entity Framework Core in an Aspire solution in your Aspire AppHost."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-get-started.mdx
index 284ed5e74..b98c5f59a 100644
--- a/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/efcore/sql-server/sql-server-get-started.mdx
@@ -1,6 +1,6 @@
---
-title: Get started with the SQL Server Entity Framework Core integrations
-description: Understand why you use the Aspire SQL Server EF Core integrations and how they fit together.
+title: SQL Server EF Core integrations overview
+description: "Use the Aspire SQL Server Entity Framework Core hosting and client integrations to provision SQL Server, share a connection, and wire up your C# DbContext seamlessly."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-connect.mdx b/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-connect.mdx
index 2f7fcf27b..85c589e58 100644
--- a/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Elasticsearch
+seoTitle: Connect to Elasticsearch from your .NET app with Aspire
description: Learn how to connect to Elasticsearch from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-get-started.mdx
index e3ececa52..a3c3d8f2f 100644
--- a/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/elasticsearch/elasticsearch-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Elasticsearch integrations
-description: Understand why you use the Aspire Elasticsearch integrations and how they fit together.
+description: Learn how the Aspire Elasticsearch integrations provision an Elasticsearch resource and configure the .NET client for search and analytics workloads.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-connect.mdx b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-connect.mdx
index 09d98525a..88efc27d7 100644
--- a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to KurrentDB
+seoTitle: "Connect to KurrentDB from Aspire apps (C#, Node.js)"
description: Learn how to connect to KurrentDB from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-get-started.mdx
index 55e004773..227bea252 100644
--- a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the KurrentDB integrations
-description: Understand why you use the Aspire KurrentDB integrations and how they fit together.
+description: Learn how the Aspire KurrentDB integrations host a KurrentDB event store resource and connect the .NET client to your Aspire AppHost projects.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-host.mdx b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-host.mdx
index 820671835..066ec0bb6 100644
--- a/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/kurrentdb/kurrentdb-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up KurrentDB in the AppHost
+seoTitle: "Set up KurrentDB in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire KurrentDB Hosting integration to orchestrate and configure a KurrentDB resource in an Aspire solution.
---
@@ -24,7 +25,7 @@ This article is the reference for the Aspire KurrentDB Hosting integration. It e
If you're new to the KurrentDB integration, start with the [Get started with KurrentDB integrations](/integrations/databases/kurrentdb/kurrentdb-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to KurrentDB](../kurrentdb-connect/).
## Installation
diff --git a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-connect.mdx b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-connect.mdx
index 82c099ee9..c2b7988f9 100644
--- a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-connect.mdx
@@ -1,6 +1,7 @@
---
title: Connect to Meilisearch
-description: Learn how to connect to Meilisearch from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
+seoTitle: Connect to Meilisearch from your .NET app with Aspire
+description: "Learn how to connect to Meilisearch from C#, Go, Python, and TypeScript consuming apps in an Aspire solution in your Aspire AppHost."
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-get-started.mdx
index 0075865a5..19eb2a64a 100644
--- a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Meilisearch integrations
-description: Understand why you use the Aspire Meilisearch integrations and how they fit together.
+description: Learn how the Aspire Meilisearch integrations run a Meilisearch search engine resource and wire the typed .NET client into your AppHost projects.
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-host.mdx b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-host.mdx
index 450fcd70d..b183592ad 100644
--- a/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/meilisearch/meilisearch-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Meilisearch in the AppHost
+seoTitle: Host Meilisearch with the Aspire AppHost hosting integration
description: Learn how to use the Aspire Meilisearch Hosting integration to orchestrate and configure a Meilisearch resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-connect.mdx b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-connect.mdx
index 7c506af95..58781b107 100644
--- a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Milvus
+seoTitle: "Connect to Milvus from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Milvus from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-get-started.mdx
index af1bc24c1..6fe27285a 100644
--- a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Milvus integrations
-description: Understand why you use the Aspire Milvus integrations and how they fit together.
+seoTitle: Get started with the Aspire Milvus integration in .NET
+description: Learn how the Aspire Milvus integrations provision a Milvus vector database resource and wire your .NET client for similarity search.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-host.mdx b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-host.mdx
index 95ce2ed43..051238145 100644
--- a/src/frontend/src/content/docs/integrations/databases/milvus/milvus-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/milvus/milvus-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Milvus in the AppHost
+seoTitle: "Set up Milvus in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Milvus Hosting integration to orchestrate and configure Milvus vector databases in an Aspire solution.
---
@@ -17,7 +18,7 @@ import milvusIcon from '@assets/icons/milvus-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Milvus Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model Milvus server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Milvus Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Milvus server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Milvus integration, start with the [Get started with Milvus integrations](/integrations/databases/milvus/milvus-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Milvus](../milvus-connect/).
@@ -92,8 +93,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -157,8 +158,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -213,8 +214,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -258,8 +259,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -307,8 +308,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -344,8 +345,8 @@ var milvus = builder.AddMilvus("milvus")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -387,8 +388,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-connect.mdx b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-connect.mdx
index d48147834..07d9350f2 100644
--- a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to MongoDB
+seoTitle: "Connect to MongoDB from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to MongoDB from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-extensions.mdx b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-extensions.mdx
index 0d3bf7aa7..07f1c2bb1 100644
--- a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-extensions.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-extensions.mdx
@@ -32,6 +32,11 @@ To get started with the Aspire Community Toolkit MongoDB hosting extensions, ins
+
+
## Add management UI
### DbGate management UI
diff --git a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-get-started.mdx
index 03299979c..5e8d73c6d 100644
--- a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the MongoDB integrations
-description: Understand why you use the Aspire MongoDB integrations and how they fit together.
+description: Learn how the Aspire MongoDB integrations provision a MongoDB container resource and configure the .NET client driver for your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-host.mdx b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-host.mdx
index 2eb404efa..6a027b88c 100644
--- a/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mongodb/mongodb-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up MongoDB in the AppHost
+seoTitle: "Set up MongoDB in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire MongoDB Hosting integration to orchestrate and configure a MongoDB database in an Aspire solution.
---
@@ -17,7 +18,7 @@ import mongodbIcon from '@assets/icons/mongodb-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire MongoDB Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model MongoDB server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire MongoDB Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model MongoDB server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the MongoDB integration, start with the [Get started with MongoDB integrations](/integrations/databases/mongodb/mongodb-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to MongoDB](../mongodb-connect/).
@@ -92,8 +93,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -153,8 +154,8 @@ var myService = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -193,7 +194,7 @@ var mongo = builder.AddMongoDB("mongo", port: 27017);
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const mongo = await builder.addMongoDB("mongo", { port: 27017 });
```
@@ -224,8 +225,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -279,8 +280,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -328,8 +329,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -377,8 +378,8 @@ var myService = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -424,8 +425,8 @@ var mongo = builder.AddMongoDB("mongo")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -469,8 +470,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-connect.mdx b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-connect.mdx
index b57d7c1cb..33bf2a94b 100644
--- a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-connect.mdx
@@ -1,5 +1,6 @@
----
+---
title: Connect to MySQL
+seoTitle: "Connect to MySQL from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to MySQL from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-extensions.mdx b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-extensions.mdx
index ada12f8a3..5640376a5 100644
--- a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-extensions.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-extensions.mdx
@@ -33,6 +33,11 @@ To get started with the Aspire Community Toolkit MySQL hosting extensions, insta
+
+
## Add management UI
### DbGate management UI
@@ -51,6 +56,11 @@ builder.AddProject("api")
builder.Build().Run();
```
+
+
This adds a new DbGate resource to the AppHost which is available from the Aspire dashboard. DbGate is a comprehensive database management tool that provides a web-based interface for managing your MySQL databases.
### Adminer management UI
diff --git a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-get-started.mdx
index 53cbc1dd1..20e384868 100644
--- a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-get-started.mdx
@@ -1,6 +1,7 @@
----
+---
title: Get started with the MySQL integrations
-description: Understand why you use the Aspire MySQL integrations and how they fit together.
+seoTitle: Get started with the Aspire MySQL integration in .NET
+description: "Use the Aspire MySQL hosting and client integrations to spin up MySQL containers, share connections from C# and TypeScript apps, and add health checks and tracing."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-host.mdx b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-host.mdx
index e7bbc6b11..8f85a0ba8 100644
--- a/src/frontend/src/content/docs/integrations/databases/mysql/mysql-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/mysql/mysql-host.mdx
@@ -1,5 +1,6 @@
----
+---
title: Set up MySQL in the AppHost
+seoTitle: "Set up MySQL in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire MySQL Hosting integration to orchestrate and configure a MySQL database in an Aspire solution.
---
@@ -17,7 +18,7 @@ import mysqlIcon from '@assets/icons/mysqlconnector-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire MySQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model MySQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire MySQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model MySQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the MySQL integration, start with the [Get started with MySQL integrations](/integrations/databases/mysql/mysql-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to MySQL](../mysql-connect/). For the MySQL Entity Framework Core (EF Core) client integration, see [Get started with the MySQL Entity Framework Core integrations](/integrations/databases/efcore/mysql/mysql-get-started/).
@@ -92,8 +93,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -190,8 +191,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -233,8 +234,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -279,8 +280,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -334,8 +335,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -381,8 +382,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -428,8 +429,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -475,8 +476,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/postgres/postgres-connect.mdx b/src/frontend/src/content/docs/integrations/databases/postgres/postgres-connect.mdx
index f25c0d638..04b671bbe 100644
--- a/src/frontend/src/content/docs/integrations/databases/postgres/postgres-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/postgres/postgres-connect.mdx
@@ -1,6 +1,7 @@
---
title: Connect to PostgreSQL
-description: Learn how to connect to PostgreSQL from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
+seoTitle: Connect to PostgreSQL from your .NET app with Aspire
+description: "Learn how to connect to PostgreSQL from C#, Go, Python, and TypeScript consuming apps in an Aspire solution in your Aspire AppHost."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/postgres/postgres-host.mdx b/src/frontend/src/content/docs/integrations/databases/postgres/postgres-host.mdx
index f3c0596c6..ed23df52e 100644
--- a/src/frontend/src/content/docs/integrations/databases/postgres/postgres-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/postgres/postgres-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up PostgreSQL in the AppHost
+seoTitle: "Set up PostgreSQL in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire PostgreSQL Hosting integration to orchestrate and configure a PostgreSQL database in an Aspire solution.
---
@@ -17,7 +18,7 @@ import postgresIcon from '@assets/icons/postgresql-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire PostgreSQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model PostgreSQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire PostgreSQL Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model PostgreSQL server and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the PostgreSQL integration, start with the [Get started with PostgreSQL integrations](/integrations/databases/postgres/postgres-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to PostgreSQL](../postgres-connect/). For the PostgreSQL Entity Framework Core (EF Core) client integration, see [Get started with the PostgreSQL Entity Framework Core integrations](/integrations/databases/efcore/postgres/postgresql-get-started/).
@@ -89,8 +90,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -156,8 +157,8 @@ builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -208,8 +209,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -249,8 +250,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -294,8 +295,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -335,8 +336,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -380,8 +381,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -429,8 +430,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -474,8 +475,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -518,8 +519,8 @@ var exampleProject = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -564,8 +565,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/postgres/postgresql-extensions.mdx b/src/frontend/src/content/docs/integrations/databases/postgres/postgresql-extensions.mdx
index 56b9cd56e..eef92f77f 100644
--- a/src/frontend/src/content/docs/integrations/databases/postgres/postgresql-extensions.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/postgres/postgresql-extensions.mdx
@@ -33,6 +33,11 @@ To get started with the Aspire Community Toolkit PostgreSQL hosting extensions,
+
+
## Add management UI
### DbGate management UI
@@ -51,6 +56,11 @@ builder.AddProject()
// After adding all resources, run the app...
```
+
+
This adds a new DbGate resource to the app host which is available from the Aspire dashboard. DbGate is a comprehensive database management tool that provides a web-based interface for managing your PostgreSQL databases.
### Adminer management UI
diff --git a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-connect.mdx b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-connect.mdx
index 2c769bdf0..353f855f0 100644
--- a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Qdrant
+seoTitle: "Connect to Qdrant from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to Qdrant from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-get-started.mdx
index 8cccb61c9..d7f0c990b 100644
--- a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Qdrant integrations
-description: Understand why you use the Aspire Qdrant integrations and how they fit together.
+seoTitle: Get started with the Aspire Qdrant integration in .NET
+description: Learn how the Aspire Qdrant integrations host a Qdrant vector database resource and connect your .NET client for semantic search workloads.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-host.mdx b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-host.mdx
index bd13d15d4..1b5d10f69 100644
--- a/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/qdrant/qdrant-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Qdrant in the AppHost
+seoTitle: "Set up Qdrant in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Qdrant Hosting integration to orchestrate and configure a Qdrant vector database in an Aspire solution.
---
@@ -17,7 +18,7 @@ import qdrantIcon from '@assets/icons/qdrant-icon.svg';
data-zoom-off
/>
-This article is the reference for the Aspire Qdrant Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Qdrant resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Qdrant Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Qdrant resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Qdrant integration, start with the [Get started with Qdrant integrations](/integrations/databases/qdrant/qdrant-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Qdrant](../qdrant-connect/).
@@ -90,8 +91,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -147,8 +148,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -199,8 +200,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -240,8 +241,8 @@ builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-connect.mdx b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-connect.mdx
index ec53bfe74..a76789495 100644
--- a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to RavenDB
+seoTitle: "Connect to RavenDB from Aspire apps (C# and Node.js)"
description: Learn how to connect to RavenDB from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-get-started.mdx
index fd60d7616..000a839b1 100644
--- a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the RavenDB integrations
-description: Understand why you use the Aspire RavenDB integrations and how they fit together.
+description: Learn how the Aspire RavenDB integrations host a RavenDB document database resource and wire the .NET document store client into your app.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-host.mdx b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-host.mdx
index 9ead73e71..1226f3568 100644
--- a/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/ravendb/ravendb-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up RavenDB in the AppHost
+seoTitle: "Set up RavenDB in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire RavenDB Hosting integration to orchestrate and configure a RavenDB database in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-connect.mdx b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-connect.mdx
index 52f2e5983..62d876394 100644
--- a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-connect.mdx
@@ -1,6 +1,7 @@
---
title: Connect to SQL Server
-description: Learn how to connect to SQL Server from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
+seoTitle: Connect to SQL Server from your .NET app with Aspire
+description: "Learn how to connect to SQL Server from C#, Go, Python, and TypeScript consuming apps in an Aspire solution in your Aspire AppHost."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-extensions.mdx b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-extensions.mdx
index 46cddff3c..48f3346f8 100644
--- a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-extensions.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-extensions.mdx
@@ -33,6 +33,11 @@ To get started with the Aspire Community Toolkit SQL Server hosting extensions,
+
+
## Add management UI
### DbGate management UI
@@ -51,6 +56,11 @@ builder.AddProject("api")
builder.Build().Run();
```
+
+
This adds a new DbGate resource to the AppHost which is available from the Aspire dashboard. DbGate is a comprehensive database management tool that provides a web-based interface for managing your SQL Server databases.
### Adminer management UI
diff --git a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-get-started.mdx
index 5cc26c2f7..9eaa99673 100644
--- a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the SQL Server integrations
-description: Understand why you use the Aspire SQL Server integrations and how they fit together.
+description: Learn how the Aspire SQL Server integrations provision a SQL Server container resource and configure the .NET client connection from your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-host.mdx b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-host.mdx
index 3cdfe6660..4add52155 100644
--- a/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sql-server/sql-server-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up SQL Server in the AppHost
+seoTitle: "Set up SQL Server in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire SQL Server Hosting integration to orchestrate and configure a SQL Server database in an Aspire solution.
---
@@ -17,7 +18,7 @@ import sqlIcon from '@assets/icons/sql-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire SQL Server Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a SQL Server instance and database resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire SQL Server Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a SQL Server instance and database resources in your [`AppHost`](/get-started/app-host/) project.
If you're new to the SQL Server integration, start with the [Get started with SQL Server integrations](/integrations/databases/sql-server/sql-server-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to SQL Server](../sql-server-connect/). For the SQL Server Entity Framework Core (EF Core) client integration, see [Get started with the SQL Server EF Core integrations](/integrations/databases/efcore/sql-server/sql-server-get-started/).
@@ -93,8 +94,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -184,8 +185,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -247,8 +248,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -296,8 +297,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -345,8 +346,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -390,8 +391,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -438,8 +439,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -477,8 +478,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-connect.mdx b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-connect.mdx
index 687506ddc..2ff191911 100644
--- a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to SQLite
+seoTitle: "Connect to SQLite from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to SQLite from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-get-started.mdx
index 82b158b6d..dbcabf5f4 100644
--- a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the SQLite integrations
-description: Understand why you use the Aspire SQLite integrations and how they fit together.
+seoTitle: Get started with the Aspire SQLite integration in .NET
+description: Learn how the Aspire SQLite integrations register a file-backed SQLite database resource and wire your .NET client with one AppHost call.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-host.mdx b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-host.mdx
index 2a1c7c74f..f9a8e37fe 100644
--- a/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/sqlite/sqlite-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up SQLite in the AppHost
+seoTitle: "Set up SQLite in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire SQLite Hosting integration to orchestrate and configure a SQLite database resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-connect.mdx b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-connect.mdx
index e18650d4a..4abea8344 100644
--- a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to SurrealDB
+seoTitle: "Connect to SurrealDB from Aspire apps (C# and Node.js)"
description: Learn how to connect to SurrealDB from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-get-started.mdx b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-get-started.mdx
index 04878ec90..9e296cf1b 100644
--- a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the SurrealDB integrations
-description: Understand why you use the Aspire SurrealDB integrations and how they fit together.
+description: Learn how the Aspire SurrealDB integrations provision a SurrealDB multi-model database resource and wire the .NET client into your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-host.mdx b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-host.mdx
index b273eb930..ee64284ef 100644
--- a/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-host.mdx
+++ b/src/frontend/src/content/docs/integrations/databases/surrealdb/surrealdb-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up SurrealDB in the AppHost
+seoTitle: "Set up SurrealDB in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire SurrealDB Hosting integration to orchestrate and configure a SurrealDB resource in an Aspire solution.
---
@@ -24,7 +25,7 @@ This article is the reference for the Aspire SurrealDB Hosting integration. It e
If you're new to the SurrealDB integration, start with the [Get started with SurrealDB integrations](/integrations/databases/surrealdb/surrealdb-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to SurrealDB](../surrealdb-connect/).
## Installation
diff --git a/src/frontend/src/content/docs/integrations/devtools/browser-logs.mdx b/src/frontend/src/content/docs/integrations/devtools/browser-logs.mdx
index 5ace9c01c..2ae8847cb 100644
--- a/src/frontend/src/content/docs/integrations/devtools/browser-logs.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/browser-logs.mdx
@@ -1,5 +1,6 @@
---
title: Browser logs
+seoTitle: Aspire browser logs and developer tools integration
description: Learn how to capture and configure browser console logs in Aspire using the BrowserLogs resource.
---
@@ -96,8 +97,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -134,8 +135,8 @@ builder.AddViteApp("web", "../web")
```
-```typescript title="TypeScript — apphost.ts"
-import { BrowserUserDataMode } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { BrowserUserDataMode } from './.aspire/modules/aspire.mjs';
builder.addViteApp("web", "../web")
.withBrowserLogs({
diff --git a/src/frontend/src/content/docs/integrations/devtools/dab.mdx b/src/frontend/src/content/docs/integrations/devtools/dab.mdx
index 65f8ade94..c95976ab3 100644
--- a/src/frontend/src/content/docs/integrations/devtools/dab.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/dab.mdx
@@ -1,5 +1,6 @@
---
title: Data API builder integration
+seoTitle: Data API builder integration for Aspire AppHost projects
description: Learn how to use the Aspire Data API Builder hosting integration to orchestrate and configure a Data API Builder resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/dev-tunnels.mdx b/src/frontend/src/content/docs/integrations/devtools/dev-tunnels.mdx
index ab955776b..273b67e6e 100644
--- a/src/frontend/src/content/docs/integrations/devtools/dev-tunnels.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/dev-tunnels.mdx
@@ -1,6 +1,7 @@
---
title: Dev Tunnels integration
-description: Learn how to use the Dev Tunnels integration for exposing local web services to the internet.
+seoTitle: Dev Tunnels integration for Aspire AppHost projects
+description: Learn how to use the Dev Tunnels integration for exposing local web services to the internet in your Aspire AppHost.
---
import { Image } from 'astro:assets';
@@ -89,8 +90,8 @@ var tunnel = builder.AddDevTunnel("my-tunnel")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -121,8 +122,8 @@ var tunnel = builder.AddDevTunnel("public-api")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -159,8 +160,8 @@ var tunnel = builder.AddDevTunnel("qa", options)
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -193,8 +194,8 @@ var tunnel = builder.AddDevTunnel("mixed-access")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-connect.mdx b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-connect.mdx
index 0c103ae56..7acba12b0 100644
--- a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to flagd
+seoTitle: "Connect to flagd from Aspire apps (C# and TypeScript)"
description: Learn how to connect to flagd from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-get-started.mdx b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-get-started.mdx
index 794043233..25a59927d 100644
--- a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the flagd integrations
-description: Understand why you use the Aspire flagd integrations and how they fit together.
+seoTitle: Get started with the Aspire flagd integration in .NET
+description: "Use the Aspire flagd hosting and client integrations to run flagd feature-flag servers locally, share configuration, and consume flags from C# and TypeScript apps."
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-host.mdx b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-host.mdx
index 7f0a8aa0f..96df7ac27 100644
--- a/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-host.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/flagd/flagd-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up flagd in the AppHost
+seoTitle: "Set up flagd in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire flagd hosting integration to orchestrate and configure a flagd resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/goff/goff-connect.mdx b/src/frontend/src/content/docs/integrations/devtools/goff/goff-connect.mdx
index c7cb87325..c4bfaed89 100644
--- a/src/frontend/src/content/docs/integrations/devtools/goff/goff-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/goff/goff-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to GO Feature Flag
+seoTitle: Connect to GO Feature Flag from your .NET app with Aspire
description: Learn how to connect to a GO Feature Flag relay proxy from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/goff/goff-get-started.mdx b/src/frontend/src/content/docs/integrations/devtools/goff/goff-get-started.mdx
index bd05ea9b4..9f0a45b65 100644
--- a/src/frontend/src/content/docs/integrations/devtools/goff/goff-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/goff/goff-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the GO Feature Flag integrations
-description: Understand why you use the Aspire GO Feature Flag integrations and how they fit together.
+description: Learn how the Aspire GO Feature Flag integrations host a GO Feature Flag relay resource and wire the OpenFeature .NET provider into your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-connect.mdx b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-connect.mdx
index 112d743d0..1a59ac9bb 100644
--- a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Mailpit
+seoTitle: Connect to Mailpit from Aspire apps for local email testing
description: Learn how to connect to Mailpit from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-get-started.mdx b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-get-started.mdx
index 759894e2b..291978e08 100644
--- a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Mailpit integrations
-description: Understand why you use the Aspire Mailpit integrations and how they fit together.
+description: Learn how the Aspire Mailpit integrations run a Mailpit SMTP test server resource locally so your AppHost can capture and inspect outgoing email.
---
import { Badge, LinkButton, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-host.mdx b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-host.mdx
index ed65f484a..30e885c32 100644
--- a/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-host.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/mailpit/mailpit-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Mailpit in the AppHost
+seoTitle: "Set up Mailpit in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Mailpit Hosting integration to orchestrate and configure a Mailpit resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/devtools/sql-projects.mdx b/src/frontend/src/content/docs/integrations/devtools/sql-projects.mdx
index b2d921838..ddec08a3e 100644
--- a/src/frontend/src/content/docs/integrations/devtools/sql-projects.mdx
+++ b/src/frontend/src/content/docs/integrations/devtools/sql-projects.mdx
@@ -1,6 +1,6 @@
---
title: SQL Database Projects integration
-description: Learn about the Aspire hosting integration for SQL Database Projects.
+description: Learn about the Aspire hosting integration for SQL Database Projects — model your schema, deploy DACPACs to SQL Server containers, and wire up CI/CD database pipelines.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/dotnet/blazor-connect.mdx b/src/frontend/src/content/docs/integrations/dotnet/blazor-connect.mdx
new file mode 100644
index 000000000..ff93f72bf
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/dotnet/blazor-connect.mdx
@@ -0,0 +1,128 @@
+---
+title: Connect Blazor apps and APIs
+description: Learn which service discovery connection properties Aspire exposes for Blazor resources and how to wire Blazor apps to APIs through your AppHost.
+---
+
+import { Image } from 'astro:assets';
+import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
+import blazorIcon from '@assets/icons/blazor-icon.svg';
+
+
+
+This page describes how to connect Blazor app resources and APIs after you've already modeled them in your AppHost. For the full hosting API surface, see [Set up Blazor hosting in the AppHost](../blazor-hosting/).
+
+## Connection properties
+
+When you use `WithReference` / `withReference`, Aspire publishes service discovery endpoint values as environment variables. The key format is:
+
+- `services__{resource-name}__{endpoint-name}__{index}`
+
+For example, if you reference an API resource named `weatherapi` with an `http` endpoint, Aspire exposes:
+
+- `services__weatherapi__http__0`
+
+Common properties used in Blazor-hosted app models are:
+
+| Property | Description |
+| ------------------------------------- | ------------------------------------------------------ |
+| `services__{resource}__http__0` | The first HTTP endpoint URL for a referenced resource |
+| `services__{resource}__https__0` | The first HTTPS endpoint URL for a referenced resource |
+| `services__{resource}__{endpoint}__0` | A named endpoint URL when the endpoint name is custom |
+
+
+
+## Connect from your AppHost
+
+Use the AppHost to connect APIs to a Blazor WebAssembly project resource, then associate the client app with a Blazor Gateway.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var weatherApi = builder.AddProject("weatherapi")
+ .WithHttpEndpoint(name: "http");
+
+var blazorApp = builder.AddBlazorWasmProject("app", "../Client/Client.csproj")
+ .WithReference(weatherApi.GetEndpoint("http"));
+
+builder.AddBlazorGateway("gateway")
+ .WithExternalHttpEndpoints()
+ .WithBlazorClientApp(blazorApp);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const weatherApi = await builder
+ .addProject('weatherapi', '../WeatherApi/WeatherApi.csproj')
+ .withHttpEndpoint({ name: 'http' });
+
+const blazorApp = await builder
+ .addBlazorWasmProject('app', '../Client/Client.csproj')
+ .withReference(await weatherApi.getEndpoint('http'));
+
+await builder
+ .addBlazorGateway('gateway')
+ .withExternalHttpEndpoints()
+ .withBlazorClientApp(blazorApp);
+
+await builder.build().run();
+```
+
+
+
+
+## Connect from consuming apps
+
+Any app resource that references the same APIs can consume the `services__...` values directly.
+
+
+
+
+```csharp title="C# — Program.cs"
+var weatherApiUrl = Environment.GetEnvironmentVariable("services__weatherapi__http__0");
+```
+
+
+
+
+```typescript title="TypeScript — index.ts"
+const weatherApiUrl = process.env.services__weatherapi__http__0;
+```
+
+
+
+
+```python title="Python — app.py"
+import os
+
+weather_api_url = os.getenv("services__weatherapi__http__0")
+```
+
+
+
+
+## See also
+
+- [Set up Blazor hosting in the AppHost](/integrations/dotnet/blazor-hosting/)
+- [Get started with Blazor hosting](/integrations/dotnet/blazor-get-started/)
+- [Service discovery](/fundamentals/service-discovery/)
diff --git a/src/frontend/src/content/docs/integrations/dotnet/blazor-get-started.mdx b/src/frontend/src/content/docs/integrations/dotnet/blazor-get-started.mdx
new file mode 100644
index 000000000..78331fc36
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/dotnet/blazor-get-started.mdx
@@ -0,0 +1,91 @@
+---
+title: Get started with Blazor hosting
+description: Learn what the Aspire Blazor hosting integration is, why to use it, and how to model and connect Blazor WebAssembly apps in your AppHost.
+---
+
+import { Image } from 'astro:assets';
+import { LinkButton, Steps } from '@astrojs/starlight/components';
+import blazorIcon from '@assets/icons/blazor-icon.svg';
+
+
+
+The Aspire Blazor hosting integration helps you model a Blazor WebAssembly project and a Blazor Gateway as first-class resources in your AppHost. You can orchestrate the frontend and backing APIs together, and keep endpoint wiring in one place.
+
+## What is the Blazor hosting integration
+
+The integration adds AppHost APIs that let you:
+
+- Add a Blazor WebAssembly project resource with `AddBlazorWasmProject` / `addBlazorWasmProject`.
+- Add a Blazor Gateway resource with `AddBlazorGateway` / `addBlazorGateway`.
+- Associate the client app with the gateway by using `WithBlazorClientApp` / `withBlazorClientApp`.
+
+## Why use Blazor hosting with Aspire
+
+Using Blazor hosting in Aspire gives you:
+
+- **One app model for frontend and APIs.** Model your Blazor client and backend services in the same AppHost.
+- **Consistent endpoint wiring.** Use AppHost references instead of manually tracking endpoint URLs.
+- **Gateway-first browser entry point.** Expose a single external gateway endpoint for browser traffic.
+- **Dashboard visibility.** See frontend and API resources together in the Aspire dashboard.
+
+## How the pieces fit together
+
+The Blazor hosting integration is a hosting-side API surface. You install it in your AppHost, define Blazor and API resources, and connect them through references and the gateway.
+
+```mermaid
+architecture-beta
+
+ group apphost(server)[AppHost]
+ group browser(server)[Browser]
+
+ service hosting(server)[Blazor hosting integration] in apphost
+ service wasm(aspire:blazor)[Blazor WebAssembly app] in apphost
+ service gateway(server)[Blazor Gateway] in apphost
+ service api(server)[API project] in apphost
+
+ browser:R --> L:gateway
+ hosting:R --> L:wasm
+ hosting:R --> L:gateway
+ wasm:B --> T:api
+```
+
+
+
+1. ### Set up Blazor resources in the AppHost
+
+ Add the hosting package, create the Blazor WebAssembly and gateway resources, and associate them with `WithBlazorClientApp` / `withBlazorClientApp`.
+
+
+ Set up Blazor hosting in the AppHost
+
+
+2. ### Connect APIs and consumers
+
+ Use AppHost references to expose service discovery properties for backend APIs and other consumers.
+
+
+ Connect Blazor apps and APIs
+
+
+
+
+## See also
+
+- [Set up Blazor hosting in the AppHost](/integrations/dotnet/blazor-hosting/)
+- [Connect Blazor apps and APIs](/integrations/dotnet/blazor-connect/)
+- [Blazor WebAssembly overview](https://learn.microsoft.com/aspnet/core/blazor/)
diff --git a/src/frontend/src/content/docs/integrations/dotnet/blazor-hosting.mdx b/src/frontend/src/content/docs/integrations/dotnet/blazor-hosting.mdx
new file mode 100644
index 000000000..94adf1db9
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/dotnet/blazor-hosting.mdx
@@ -0,0 +1,213 @@
+---
+title: Set up Blazor hosting in the AppHost
+seoTitle: 'Set up Blazor hosting in the Aspire AppHost'
+description: Learn how to use the Aspire Blazor hosting integration APIs to model Blazor WebAssembly projects and a Blazor Gateway in your AppHost.
+---
+
+import { Image } from 'astro:assets';
+import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
+import LearnMore from '@components/LearnMore.astro';
+import blazorIcon from '@assets/icons/blazor-icon.svg';
+
+
+
+This article is the reference for the Aspire Blazor hosting integration. It lists the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model Blazor WebAssembly projects and a Blazor Gateway in your [`AppHost`](/get-started/app-host/) project.
+
+If you're new to this integration, start with [Get started with Blazor hosting](/integrations/dotnet/blazor-get-started/). For how apps connect through the gateway and service discovery properties, see [Connect Blazor apps and APIs](../blazor-connect/).
+
+## Installation
+
+To start building an Aspire app that uses Blazor hosting, install the [📦 Aspire.Hosting.Blazor](https://www.nuget.org/packages/Aspire.Hosting.Blazor) NuGet package:
+
+
+
+
+```bash title="Terminal"
+aspire add Aspire.Hosting.Blazor
+```
+
+
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
+
+
+Or, choose a manual installation approach:
+
+```csharp title="C# — AppHost.cs"
+#:package Aspire.Hosting.Blazor@*
+```
+
+```xml title="XML — AppHost.csproj"
+
+```
+
+
+
+
+```bash title="Terminal"
+aspire add Aspire.Hosting.Blazor
+```
+
+
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
+
+
+This updates your `aspire.config.json` with the Blazor hosting package:
+
+```json title="aspire.config.json" ins={3}
+{
+ "packages": {
+ "Aspire.Hosting.Blazor": "13.4.0"
+ }
+}
+```
+
+
+
+
+## Add Blazor WebAssembly project
+
+Use `AddBlazorWasmProject` / `addBlazorWasmProject` to add a Blazor WebAssembly project to the AppHost model.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddProject("api");
+
+var blazorApp = builder.AddBlazorWasmProject("app", "../MyBlazorApp/MyBlazorApp.csproj");
+blazorApp.WithReference(api);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addProject('api', '../MyApi/MyApi.csproj');
+
+const blazorApp = await builder
+ .addBlazorWasmProject('app', '../MyBlazorApp/MyBlazorApp.csproj')
+ .withReference(await api.getEndpoint('http'));
+
+await builder.build().run();
+```
+
+
+
+
+## Add Blazor Gateway
+
+Use `AddBlazorGateway` / `addBlazorGateway` to add the Blazor Gateway resource. The gateway is the browser-facing endpoint for your hosted Blazor app.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var gateway = builder.AddBlazorGateway("gateway")
+ .WithExternalHttpEndpoints();
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const gateway = await builder
+ .addBlazorGateway('gateway')
+ .withExternalHttpEndpoints();
+
+await builder.build().run();
+```
+
+
+
+
+:::note
+`WithExternalHttpEndpoints()` / `withExternalHttpEndpoints()` marks the gateway endpoint as externally accessible so browser traffic can reach your app.
+:::
+
+## Associate a client app with the gateway
+
+Use `WithBlazorClientApp` / `withBlazorClientApp` to bind the WebAssembly project resource to the Blazor Gateway:
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var weatherApi = builder.AddProject("weatherapi");
+
+var blazorApp = builder.AddBlazorWasmProject("app", "../MyBlazorApp/MyBlazorApp.csproj");
+blazorApp.WithReference(weatherApi);
+
+var gateway = builder.AddBlazorGateway("gateway")
+ .WithExternalHttpEndpoints();
+
+gateway.WithBlazorClientApp(blazorApp);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const weatherApi = await builder.addProject(
+ 'weatherapi',
+ '../WeatherApi/WeatherApi.csproj'
+);
+
+const blazorApp = await builder
+ .addBlazorWasmProject('app', '../MyBlazorApp/MyBlazorApp.csproj')
+ .withReference(await weatherApi.getEndpoint('http'));
+
+await builder
+ .addBlazorGateway('gateway')
+ .withExternalHttpEndpoints()
+ .withBlazorClientApp(blazorApp);
+
+await builder.build().run();
+```
+
+
+
+
+
+
+## See also
+
+- [Get started with Blazor hosting](/integrations/dotnet/blazor-get-started/)
+- [Connect Blazor apps and APIs](/integrations/dotnet/blazor-connect/)
+- [Aspire integrations overview](/integrations/overview/)
diff --git a/src/frontend/src/content/docs/integrations/dotnet/csharp-file-based-apps.mdx b/src/frontend/src/content/docs/integrations/dotnet/csharp-file-based-apps.mdx
index d9f8ce330..2b516cce9 100644
--- a/src/frontend/src/content/docs/integrations/dotnet/csharp-file-based-apps.mdx
+++ b/src/frontend/src/content/docs/integrations/dotnet/csharp-file-based-apps.mdx
@@ -1,5 +1,6 @@
---
title: C# file-based apps
+seoTitle: "Aspire C# file-based apps in the AppHost"
description: Learn how to use the Aspire C# file-based apps hosting integration to run single .cs files without a project file alongside your other AppHost resources.
---
@@ -23,7 +24,7 @@ import csharpIcon from '@assets/icons/csharp.svg';
data-zoom-off
/>
-This article is the reference for the Aspire C# file-based apps hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model C# file-based app resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire C# file-based apps hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model C# file-based app resources in your [`AppHost`](/get-started/app-host/) project.
C# file-based applications let you run single `.cs` files without a `.csproj` project file. This feature, built on .NET 10 SDK's file-based app support, integrates directly with Aspire's orchestration. Use `AddCSharpApp` (or `addCSharpApp` in TypeScript) to add these lightweight apps to your AppHost alongside traditional projects, containers, and executables.
@@ -58,8 +59,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -93,8 +94,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -144,8 +145,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -229,7 +230,7 @@ builder.Build().Run();
Use `#:package` directives to add NuGet package references directly in the source file instead of a `.csproj`.
:::note
-A TypeScript AppHost (`apphost.ts`) is already a file-based script with no project file required. The `#:sdk` and `#:package` directives are specific to the C# file-based AppHost feature and have no TypeScript equivalent.
+A TypeScript AppHost (`apphost.mts`) is already a file-based script with no project file required. The `#:sdk` and `#:package` directives are specific to the C# file-based AppHost feature and have no TypeScript equivalent.
:::
diff --git a/src/frontend/src/content/docs/integrations/dotnet/dotnet-tool-resources.mdx b/src/frontend/src/content/docs/integrations/dotnet/dotnet-tool-resources.mdx
index 8f8454bcb..89855c58d 100644
--- a/src/frontend/src/content/docs/integrations/dotnet/dotnet-tool-resources.mdx
+++ b/src/frontend/src/content/docs/integrations/dotnet/dotnet-tool-resources.mdx
@@ -1,5 +1,6 @@
---
title: .NET tool resources
+seoTitle: Add .NET tool resources to your Aspire AppHost
description: Learn how to use the AddDotnetTool AppHost API to run .NET CLI tools as resources in your Aspire solution.
---
@@ -16,7 +17,7 @@ import dotnetIcon from '@assets/icons/dotnet.svg';
data-zoom-off
/>
-This article is the reference for the .NET tool resources AppHost integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model .NET CLI tool resources in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the .NET tool resources AppHost integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model .NET CLI tool resources in your [`AppHost`](/get-started/app-host/) project.
:::caution[Experimental feature]
The `DotnetToolResource` and related APIs are experimental and may change in future versions. The C# AppHost requires the .NET 10 SDK, and you must suppress the `ASPIREDOTNETTOOL` diagnostic to use these APIs in C#.
@@ -62,8 +63,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -99,8 +100,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,7 +137,7 @@ var efTool = builder.AddDotnetTool("ef", "dotnet-ef")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const efTool = await builder.addDotnetTool("ef", "dotnet-ef");
await efTool.withToolVersion("9.0.1");
```
@@ -157,7 +158,7 @@ var efTool = builder.AddDotnetTool("ef", "dotnet-ef")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const efTool = await builder.addDotnetTool("ef", "dotnet-ef");
await efTool.withToolVersion("10.0.*");
```
@@ -180,7 +181,7 @@ var efTool = builder.AddDotnetTool("ef", "dotnet-ef")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const efTool = await builder.addDotnetTool("ef", "dotnet-ef");
await efTool.withToolPrerelease();
```
@@ -207,7 +208,7 @@ var tool = builder.AddDotnetTool("my-tool", "my-custom-tool")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const tool = await builder.addDotnetTool("my-tool", "my-custom-tool");
await tool.withToolSource("https://my-private-feed.example.com/nuget/v3/index.json");
```
@@ -231,7 +232,7 @@ var tool = builder.AddDotnetTool("my-tool", "my-custom-tool")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const tool = await builder.addDotnetTool("my-tool", "my-custom-tool");
await tool.withToolSource("./local-packages");
await tool.withToolIgnoreExistingFeeds();
@@ -255,7 +256,7 @@ var tool = builder.AddDotnetTool("my-tool", "my-custom-tool")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const tool = await builder.addDotnetTool("my-tool", "my-custom-tool");
await tool.withToolIgnoreFailedSources();
```
@@ -294,8 +295,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/dotnet/launch-profiles.mdx b/src/frontend/src/content/docs/integrations/dotnet/launch-profiles.mdx
index b5e469b7e..a00f201f3 100644
--- a/src/frontend/src/content/docs/integrations/dotnet/launch-profiles.mdx
+++ b/src/frontend/src/content/docs/integrations/dotnet/launch-profiles.mdx
@@ -1,5 +1,6 @@
---
title: C# launch profiles
+seoTitle: "C# launch profiles in the Aspire AppHost"
description: Learn how Aspire integrates with .NET launch profiles for C# AppHosts and service projects.
---
diff --git a/src/frontend/src/content/docs/integrations/dotnet/maui.mdx b/src/frontend/src/content/docs/integrations/dotnet/maui.mdx
index 1d437e1a9..40bfe1b23 100644
--- a/src/frontend/src/content/docs/integrations/dotnet/maui.mdx
+++ b/src/frontend/src/content/docs/integrations/dotnet/maui.mdx
@@ -1,5 +1,6 @@
---
title: .NET MAUI integration
+seoTitle: ".NET MAUI integration for Aspire: hosting and client wiring"
description: Learn how to use the Aspire .NET MAUI integration to orchestrate .NET MAUI mobile and desktop applications alongside backend services in your AppHost.
---
diff --git a/src/frontend/src/content/docs/integrations/dotnet/project-resources.mdx b/src/frontend/src/content/docs/integrations/dotnet/project-resources.mdx
index 48ff7d2ea..c6bcbc00b 100644
--- a/src/frontend/src/content/docs/integrations/dotnet/project-resources.mdx
+++ b/src/frontend/src/content/docs/integrations/dotnet/project-resources.mdx
@@ -1,6 +1,7 @@
---
title: Project resources
-description: Learn how to add .NET projects as resources in your Aspire AppHost — with examples for both AppHost.cs (C#) and apphost.ts (TypeScript).
+seoTitle: "Add C# project resources to your Aspire AppHost"
+description: Learn how to add .NET projects as resources in your Aspire AppHost — with examples for both AppHost.cs (C#) and apphost.mts (TypeScript).
---
import { Image } from 'astro:assets';
@@ -20,7 +21,7 @@ import proxyWithRandomPorts from '@assets/fundamentals/networking/proxy-with-ran
data-zoom-off
/>
-This article is the reference for modeling .NET projects as first-class Aspire resources in your AppHost. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to add, configure, and connect a .NET project resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for modeling .NET projects as first-class Aspire resources in your AppHost. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to add, configure, and connect a .NET project resource in your [`AppHost`](/get-started/app-host/) project.
## When to use project resources
@@ -64,8 +65,8 @@ The path to the project comes from the `ProjectReference`, so `AddProject` doesn
In a TypeScript AppHost, pass the path to the `.csproj` file directly — no `ProjectReference` in the AppHost project file is needed:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -99,8 +100,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -161,8 +162,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -214,7 +215,7 @@ builder.AddProject("frontend")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
await builder.addProject("frontend", "../Networking_Frontend/Networking_Frontend.csproj")
.withHttpEndpoint({ port: 5066 })
.withHttpsEndpoint({ port: 7239 });
@@ -263,8 +264,8 @@ builder.AddProject(
The TypeScript AppHost doesn't currently expose a `configure` callback for `addProject`. To use Kestrel endpoints, call `withHttpsEndpoint()` directly and omit `launchProfileOrOptions` to prevent launch-profile endpoints from conflicting:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -288,8 +289,8 @@ builder.AddProject("inventoryservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -320,7 +321,7 @@ builder.AddProject("frontend")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
await builder.addProject("frontend", "../Networking_Frontend/Networking_Frontend.csproj")
.withHttpEndpoint({ port: 5066 })
.withReplicas(2);
@@ -352,7 +353,7 @@ builder.AddProject("frontend")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
await builder.addProject("frontend", "../Networking_Frontend/Networking_Frontend.csproj")
.withHttpEndpoint({ port: 5066 });
```
@@ -380,7 +381,7 @@ builder.AddProject("frontend")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
await builder.addProject("frontend", "../Networking_Frontend/Networking_Frontend.csproj")
.withHttpEndpoint();
```
@@ -469,8 +470,8 @@ builder.Build().Run();
The TypeScript AppHost doesn't use generated project types. Use the `.csproj` path directly for each project — name collisions don't apply:
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/frameworks/bun-apps.mdx b/src/frontend/src/content/docs/integrations/frameworks/bun-apps.mdx
index c579f906f..3a56b9c67 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/bun-apps.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/bun-apps.mdx
@@ -1,5 +1,6 @@
---
title: Bun integration
+seoTitle: Bun integration for Aspire AppHost (Community Toolkit)
description: Learn how to use the Aspire Community Toolkit Bun hosting integration to orchestrate Bun applications alongside other resources in the Aspire app host.
---
diff --git a/src/frontend/src/content/docs/integrations/frameworks/dapr.mdx b/src/frontend/src/content/docs/integrations/frameworks/dapr.mdx
index 54baf053b..ea3c9dbc1 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/dapr.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/dapr.mdx
@@ -1,5 +1,6 @@
---
title: Dapr framework integration
+seoTitle: Dapr framework integration for Aspire AppHost projects
description: Learn how to use the Aspire Community Toolkit Dapr hosting integration to add Dapr sidecars, state stores, pub/sub components, and more to your Aspire AppHost project.
---
diff --git a/src/frontend/src/content/docs/integrations/frameworks/deno-apps.mdx b/src/frontend/src/content/docs/integrations/frameworks/deno-apps.mdx
index d6ca2994c..34d900a30 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/deno-apps.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/deno-apps.mdx
@@ -1,5 +1,6 @@
---
title: Deno integration
+seoTitle: Deno integration for Aspire AppHost (Community Toolkit)
description: Learn how to use the Aspire Deno Hosting integration to run Deno applications alongside your other Aspire resources in the AppHost.
---
diff --git a/src/frontend/src/content/docs/integrations/frameworks/go-apps.mdx b/src/frontend/src/content/docs/integrations/frameworks/go-apps.mdx
deleted file mode 100644
index 9e7fe67b6..000000000
--- a/src/frontend/src/content/docs/integrations/frameworks/go-apps.mdx
+++ /dev/null
@@ -1,167 +0,0 @@
----
-title: Go integration
-description: Learn how to use the Aspire Community Toolkit Go hosting integration to orchestrate Go applications alongside other resources in the Aspire app host.
----
-
-import { Badge } from '@astrojs/starlight/components';
-
-import { Image } from 'astro:assets';
-import InstallPackage from '@components/InstallPackage.astro';
-import goIcon from '@assets/icons/go.svg';
-
-
-
-
-
-The Aspire Go hosting integration enables you to run Go applications alongside your other Aspire resources in the app host. Go apps participate in the same service discovery, health checks, OpenTelemetry export, and Aspire dashboard support as the rest of your solution.
-
-:::note
-TypeScript AppHost support for this integration is not yet available. The examples on this page use the C# AppHost only.
-:::
-
-## Hosting integration
-
-To access the Go hosting APIs in your [`AppHost`](/get-started/app-host/) project, install the [📦 CommunityToolkit.Aspire.Hosting.Golang](https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang) NuGet package:
-
-
-
-### Add Go app
-
-Add a Go application to your app host using the `AddGolangApp` extension method:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp("go-api", "../go-api")
- .WithHttpEndpoint(env: "PORT")
- .WithHttpHealthCheck("/health");
-
-builder.AddProject("apiservice")
- .WithReference(goApp);
-
-builder.Build().Run();
-```
-
-`AddGolangApp` requires:
-
-- **name**: The name of the resource in the Aspire dashboard.
-- **workingDirectory**: The path to the directory containing your Go application, relative to the AppHost project. The app host runs `go run ` in this directory.
-
-By default, the executable target is `.` (the Go module root), which is equivalent to `go run .`.
-
-### Specify the executable target
-
-Pass an explicit `executable` argument to run a package at a specific path inside the working directory:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp(
- name: "go-api",
- workingDirectory: "../go-api",
- executable: "./cmd/server")
- .WithHttpEndpoint(env: "PORT");
-
-builder.Build().Run();
-```
-
-### Configure HTTP endpoints
-
-Go applications typically read the port from an environment variable. Use `WithHttpEndpoint` to declare the HTTP endpoint and bind it to a named environment variable:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp("go-api", "../go-api")
- .WithHttpEndpoint(port: 8080, env: "PORT");
-
-builder.Build().Run();
-```
-
-Your Go application reads the `PORT` variable at startup:
-
-```go title="Go — main.go"
-package main
-
-import (
- "fmt"
- "net/http"
- "os"
-)
-
-func main() {
- port := os.Getenv("PORT")
- if port == "" {
- port = "8080"
- }
-
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintf(w, "Hello from Go!")
- })
-
- fmt.Printf("Server listening on port %s\n", port)
- http.ListenAndServe(":"+port, nil)
-}
-```
-
-### Manage module dependencies
-
-Call `WithGoModTidy` to run `go mod tidy` before the Go app starts. This ensures the module's dependency graph is consistent and removes unused entries from `go.mod` and `go.sum`:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp("go-api", "../go-api")
- .WithGoModTidy()
- .WithHttpEndpoint(env: "PORT");
-
-builder.Build().Run();
-```
-
-Call `WithGoModDownload` to run `go mod download` instead. This downloads all module dependencies to the local module cache without modifying `go.mod` or `go.sum`:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp("go-api", "../go-api")
- .WithGoModDownload()
- .WithHttpEndpoint(env: "PORT");
-
-builder.Build().Run();
-```
-
-Both methods run only in run mode and have no effect during publish.
-
-### Use build tags
-
-Pass `buildTags` to control conditional compilation in the Go source:
-
-```csharp title="C# — AppHost.cs"
-var builder = DistributedApplication.CreateBuilder(args);
-
-var goApp = builder.AddGolangApp(
- name: "go-api",
- workingDirectory: "../go-api",
- executable: ".",
- buildTags: ["integration"])
- .WithHttpEndpoint(env: "PORT");
-
-builder.Build().Run();
-```
-
-The build tags are passed to `go run` as `-tags integration` and to the generated Dockerfile's build stage as `go build -tags integration`.
-
-## See also
-
-- [📦 CommunityToolkit.Aspire.Hosting.Golang](https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang)
-- [Go documentation](https://go.dev/doc/)
-- [Aspire Community Toolkit](https://github.com/CommunityToolkit/Aspire)
-- [Aspire integrations overview](/integrations/overview/)
-- [Aspire GitHub repo](https://github.com/microsoft/aspire)
diff --git a/src/frontend/src/content/docs/integrations/frameworks/go/go-get-started.mdx b/src/frontend/src/content/docs/integrations/frameworks/go/go-get-started.mdx
new file mode 100644
index 000000000..fba14adb3
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/frameworks/go/go-get-started.mdx
@@ -0,0 +1,91 @@
+---
+title: Get started with the Go integration
+description: Understand how the Aspire Go hosting integration runs Go apps from your AppHost and how to choose the right setup path.
+---
+
+import { LinkButton, Steps } from '@astrojs/starlight/components';
+import ThemeImage from '@components/ThemeImage.astro';
+import goIcon from '@assets/icons/go-icon.png';
+import goLightIcon from '@assets/icons/go-light-icon.png';
+
+
+
+The Aspire Go hosting integration lets you run Go applications alongside your other Aspire resources from the AppHost. Aspire runs Go apps with the local Go toolchain during development, wires them into the Aspire app model, supports service discovery and endpoint configuration, and can emit Dockerfile-based container build artifacts for deployment targets that need them.
+
+:::caution[Community Toolkit package deprecated]
+As of Aspire 13.4, Go hosting support is available in the official `Aspire.Hosting.Go` package. The previous `CommunityToolkit.Aspire.Hosting.Golang` package is deprecated because Go support has graduated into core Aspire. Use `Aspire.Hosting.Go` and `AddGoApp` / `addGoApp` for new Aspire 13.4+ applications.
+:::
+
+## Why use Go with Aspire
+
+Adding Go apps through Aspire gives you:
+
+- **One app model for every service.** Model Go applications, projects, containers, and backing services together in the AppHost.
+- **Local development with the Go toolchain.** Aspire runs Go apps with commands such as `go run .` or `go run ./cmd/server` instead of requiring a container for every edit-run loop.
+- **Endpoint and environment wiring.** Configure ports, environment variables, service discovery, and resource dependencies from the AppHost.
+- **Dashboard visibility.** Go app resources appear in the Aspire dashboard with logs, status, endpoints, and lifecycle controls.
+- **Publish-time container artifacts.** Deployment targets that need container build artifacts can use an existing Dockerfile or let Aspire generate one from the Go app resource.
+
+## How the pieces fit together
+
+The Go integration is a **hosting integration**. You install it in the AppHost, add one or more Go app resources, and configure how Aspire runs, debugs, and publishes each app.
+
+```mermaid
+architecture-beta
+
+ group apphost(server)[AppHost]
+ group goapp(server)[Go app]
+
+ service hosting(server)[Go hosting integration] in apphost
+ service resource(logos:go)[Go app resource] in apphost
+ service toolchain(logos:go)[Go toolchain] in goapp
+ service app(logos:go)[Go process] in goapp
+
+ hosting:R --> L:resource
+ resource:R --> L:toolchain
+ toolchain:R --> L:app
+```
+
+
+
+1. ### Set up Go apps in the AppHost
+
+ Add the `Aspire.Hosting.Go` hosting integration to your AppHost, then use `AddGoApp` / `addGoApp` to model a Go app resource. The host reference covers package installation, common Go layouts, app arguments, build options, Go module helper commands, Delve debugging, private modules, and publish behavior.
+
+
+ Set up Go apps in the AppHost
+
+
+2. ### Optionally try the Go AppHost templates
+
+ The `Aspire.Hosting.Go` integration works from C# and TypeScript AppHosts. Aspire also includes experimental Go AppHost and Go starter template support in the Aspire CLI. These templates use experimental Go AppHost APIs instead of the `Aspire.Hosting.Go` package.
+
+
+ Try the experimental Go templates
+
+
+
+
+## See also
+
+- [Go documentation](https://go.dev/doc/)
+- [Go AppHost setup reference](/integrations/frameworks/go/go-host/)
+- [Aspire integrations overview](/integrations/overview/)
diff --git a/src/frontend/src/content/docs/integrations/frameworks/go/go-host.mdx b/src/frontend/src/content/docs/integrations/frameworks/go/go-host.mdx
new file mode 100644
index 000000000..ed9988656
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/frameworks/go/go-host.mdx
@@ -0,0 +1,479 @@
+---
+title: Set up Go apps in the AppHost
+seoTitle: "Set up Go apps in the Aspire AppHost: hosting integration"
+description: Learn how to use the Aspire Go hosting integration to orchestrate and configure Go applications in an Aspire solution.
+---
+
+import { TabItem, Tabs } from '@astrojs/starlight/components';
+import LearnMore from '@components/LearnMore.astro';
+import ThemeImage from '@components/ThemeImage.astro';
+import goIcon from '@assets/icons/go-icon.png';
+import goLightIcon from '@assets/icons/go-light-icon.png';
+
+
+
+This article is the reference for the Aspire Go hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to orchestrate Go applications in your [`AppHost`](/get-started/app-host/) project.
+
+If you're new to the Go integration, start with the [Get started with the Go integration](/integrations/frameworks/go/go-get-started/) guide.
+
+:::caution[Community Toolkit package deprecated]
+As of Aspire 13.4, Go hosting support is available in the official `Aspire.Hosting.Go` package. The previous `CommunityToolkit.Aspire.Hosting.Golang` package is deprecated because Go support has graduated into core Aspire. Use `Aspire.Hosting.Go` and `AddGoApp` / `addGoApp` for new Aspire 13.4+ applications.
+:::
+
+:::note[Prerequisites]
+Install the [Go toolchain](https://go.dev/dl/) and make sure the `go` command is available on your `PATH`. Install [Delve](https://github.com/go-delve/delve) and make sure the `dlv` command is available on your `PATH` when you use headless Delve debugging.
+:::
+
+## Installation
+
+To start building an Aspire app that uses Go, install the [📦 Aspire.Hosting.Go](https://www.nuget.org/packages/Aspire.Hosting.Go) NuGet package:
+
+
+
+
+```bash title="Terminal"
+aspire add go
+```
+
+
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
+
+
+Or, choose a manual installation approach:
+
+```csharp title="C# — AppHost.cs"
+#:package Aspire.Hosting.Go@*
+```
+
+```xml title="XML — AppHost.csproj"
+
+```
+
+
+
+
+```bash title="Terminal"
+aspire add go
+```
+
+
+ Learn more about [`aspire add`](/reference/cli/commands/aspire-add/) in the
+ command reference.
+
+
+This updates your `aspire.config.json` with the Go hosting integration package:
+
+```json title="aspire.config.json" ins={3}
+{
+ "packages": {
+ "Aspire.Hosting.Go": "13.4.0"
+ }
+}
+```
+
+
+
+
+## Add Go app
+
+Use `AddGoApp` / `addGoApp` to add a Go application to your AppHost. By default, Aspire runs `go run .` from the application directory.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp("api", "./api")
+ .WithHttpEndpoint(port: 8080, env: "PORT")
+ .WithExternalHttpEndpoints();
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api');
+await api.withHttpEndpoint({ port: 8080, env: 'PORT' });
+await api.withExternalHttpEndpoints();
+
+await builder.build().run();
+```
+
+
+
+
+The method accepts the following common parameters:
+
+- **name**: The name of the resource in the Aspire dashboard.
+- **appDirectory**: The path to the Go module root. This directory usually contains `go.mod` and is also the Docker build context for deployment targets that emit container build artifacts.
+- **packagePath**: The Go package to run or build relative to `appDirectory`. Defaults to `"."`.
+
+Go applications commonly read the `PORT` environment variable set by `WithHttpEndpoint` / `withHttpEndpoint`:
+
+```go title="main.go"
+package main
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+)
+
+func main() {
+ port := os.Getenv("PORT")
+ if port == "" {
+ port = "8080"
+ }
+
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Hello from Go!")
+ })
+
+ log.Printf("Listening on :%s", port)
+ log.Fatal(http.ListenAndServe(":"+port, nil))
+}
+```
+
+## Configure app directory and package path
+
+Use `appDirectory` for the Go module root, and use `packagePath` when the `main` package is under a subdirectory such as `cmd/server`.
+
+For a common layout like this:
+
+```text title="Go app layout"
+api/
+|-- go.mod
+|-- internal/
+`-- cmd/
+ `-- server/
+ `-- main.go
+```
+
+Configure the AppHost to run `go run ./cmd/server` from `./api`:
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp(
+ name: "api",
+ appDirectory: "./api",
+ packagePath: "./cmd/server")
+ .WithHttpEndpoint(env: "PORT");
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api', {
+ packagePath: './cmd/server',
+});
+await api.withHttpEndpoint({ env: 'PORT' });
+
+await builder.build().run();
+```
+
+
+
+
+The same `packagePath` is used for local run mode, headless Delve debugging, and publish-time `go build`.
+
+## Configure build options
+
+Go build-time options are parameters on `AddGoApp` / `addGoApp`. Aspire passes them to `go run` during local development and to `go build` when it generates a Dockerfile for publish.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp(
+ name: "api",
+ appDirectory: "./api",
+ packagePath: "./cmd/server",
+ buildTags: ["netgo", "integration"],
+ ldFlags: "-X main.version=1.2.3 -s -w",
+ gcFlags: "all=-N -l",
+ raceDetector: true);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api', {
+ packagePath: './cmd/server',
+ buildTags: ['netgo', 'integration'],
+ ldFlags: '-X main.version=1.2.3 -s -w',
+ gcFlags: 'all=-N -l',
+ raceDetector: true,
+});
+
+await builder.build().run();
+```
+
+
+
+
+The options map to Go command-line flags:
+
+- `buildTags`: Adds `-tags=,`.
+- `ldFlags`: Adds `-ldflags=`.
+- `gcFlags`: Adds `-gcflags=`.
+- `raceDetector`: Adds `-race` in local run mode. The generated Dockerfile excludes `-race` because race detection requires CGO and publish builds create a static Linux binary.
+
+## Pass app arguments
+
+Use `WithAppArgs` / `withAppArgs` to pass arguments to the Go program after the package path.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp("api", "./api")
+ .WithAppArgs("--config", "dev.yaml")
+ .WithHttpEndpoint(env: "PORT");
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api');
+await api.withAppArgs(['--config', 'dev.yaml']);
+await api.withHttpEndpoint({ env: 'PORT' });
+
+await builder.build().run();
+```
+
+
+
+
+In normal run mode, this produces a command like `go run . --config dev.yaml`. In headless Delve mode, Aspire passes the app arguments after Delve's `--` separator.
+
+## Run Go module helper commands
+
+The Go integration can run common module and static analysis commands before the app starts. These helpers create setup resources in run mode and make the Go app wait for them to complete.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp("api", "./api")
+ .WithModTidy()
+ .WithModVendor()
+ .WithModDownload()
+ .WithVetTool()
+ .WithHttpEndpoint(env: "PORT");
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api');
+await api.withModTidy();
+await api.withModVendor();
+await api.withModDownload();
+await api.withVetTool();
+await api.withHttpEndpoint({ env: 'PORT' });
+
+await builder.build().run();
+```
+
+
+
+
+The helper methods run these commands:
+
+- `WithModTidy` / `withModTidy`: Runs `go mod tidy -e`.
+- `WithModVendor` / `withModVendor`: Runs `go mod vendor`.
+- `WithModDownload` / `withModDownload`: Runs `go mod download`.
+- `WithVetTool` / `withVetTool`: Runs `go vet ./...`.
+
+When multiple module helpers are configured, Aspire orders them so dependency-changing steps complete before later module cache or vendor steps.
+
+## Debug Go apps
+
+### VS Code debugging
+
+Go app resources automatically support VS Code debugging when the [Go extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=golang.go) (`golang.go`) is installed.
+
+The Aspire VS Code extension detects the `golang.go` extension and, when you start your AppHost in debug mode, launches the Go debugger via `dlv-dap`. No additional configuration is required beyond `AddGoApp` / `addGoApp`. Any `buildTags`, `ldFlags`, or `gcFlags` configured on the resource are automatically forwarded to Delve as build flags, so the debugger compiles your program with the same flags used during normal development.
+
+:::note
+When `WithDelveServer` / `withDelveServer` is applied to a resource, VS Code debugging is disabled for that resource. The two modes are mutually exclusive: `WithDelveServer` starts a headless Delve server that an IDE attaches to manually, while VS Code debugging hands control of launch and build to the `golang.go` extension.
+:::
+
+### Headless Delve server
+
+For GoLand, VS Code attach mode, or another Delve-compatible client, use `WithDelveServer` / `withDelveServer`. This replaces the application command with a headless Delve server, such as `dlv --headless=true --listen=127.0.0.1:2345 --api-version=2 debug .`.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp("api", "./api")
+ .WithDelveServer(port: 2345)
+ .WithHttpEndpoint(port: 8080, env: "PORT");
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api');
+await api.withDelveServer({ port: 2345 });
+await api.withHttpEndpoint({ port: 8080, env: 'PORT' });
+
+await builder.build().run();
+```
+
+
+
+
+Start your attach configuration after the Go resource is running in the Aspire dashboard. For GoLand, create a **Go Remote** configuration with host `localhost` and port `2345`. For VS Code attach mode, add a launch configuration like this:
+
+```json title=".vscode/launch.json"
+{
+ "name": "Attach to api",
+ "type": "go",
+ "request": "attach",
+ "mode": "remote",
+ "host": "localhost",
+ "port": 2345
+}
+```
+
+## Publish Go apps
+
+When a publisher or deployment target emits container build artifacts for a Go app, Aspire uses the `appDirectory` as the Docker build context:
+
+- If the app directory already contains a `Dockerfile`, Aspire uses it.
+- If no `Dockerfile` exists, Aspire generates a multi-stage Dockerfile.
+- The generated Dockerfile uses a `golang:-alpine` build image by default. Aspire detects the Go version from `go.mod`, preferring a `toolchain` directive over the `go` directive when both are present.
+- The build stage runs `go mod download`, caches the module and build caches, and builds a static Linux binary with `CGO_ENABLED=0` and `GOOS=linux`.
+- The runtime stage uses a small runtime image, installs certificate and time zone data for Alpine-based images, creates a non-root `app` user, and starts the compiled binary.
+- The generated `go build` command uses the same `packagePath`, `buildTags`, `ldFlags`, and `gcFlags` configured on the Go app resource. It intentionally excludes `raceDetector` for publish builds.
+
+For private modules, use `WithGoPrivate` / `withGoPrivate` to configure the generated Dockerfile with `GOPRIVATE` and BuildKit secret-based authentication. This setting only affects generated Dockerfiles; local run mode continues to use the developer's local Go and Git credentials.
+
+
+
+
+```csharp title="C# — AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var api = builder.AddGoApp("api", "./api")
+ .WithGoPrivate(["github.com/myorg"], "github.com");
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const api = await builder.addGoApp('api', './api');
+await api.withGoPrivate(['github.com/myorg'], 'github.com');
+
+await builder.build().run();
+```
+
+
+
+
+
+ For more information about publishing Aspire apps, see [Deployment
+ overview](/deployment/overview/).
+
+
+## Experimental Go AppHost templates
+
+The `Aspire.Hosting.Go` integration can be used from C# and TypeScript AppHosts. Aspire also includes experimental Go AppHost and Go starter template support in the Aspire CLI. The Go AppHost templates use experimental Go AppHost APIs instead of the `Aspire.Hosting.Go` package. To enable Go AppHost language support for CLI templates, enable the Go polyglot feature flag:
+
+```bash title="Aspire CLI"
+aspire config set features:experimentalPolyglot:go true --global
+```
+
+After enabling the feature, you can create a Go starter app with:
+
+```bash title="Aspire CLI"
+aspire new aspire-go-starter
+```
+
+
+ For more information about feature flags, see [Aspire CLI
+ configuration](/reference/cli/configuration/#toggle-preview-feature-experiences).
+ For template command details, see [`aspire
+ new`](/reference/cli/commands/aspire-new/).
+
+
+## See also
+
+- [Go documentation](https://go.dev/doc/)
+- [Delve debugger](https://github.com/go-delve/delve)
+- [Get started with the Go integration](/integrations/frameworks/go/go-get-started/)
+- [Aspire integrations overview](/integrations/overview/)
+- [Aspire GitHub repo](https://github.com/microsoft/aspire)
diff --git a/src/frontend/src/content/docs/integrations/frameworks/java.mdx b/src/frontend/src/content/docs/integrations/frameworks/java.mdx
index 37a1ed816..d1564b970 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/java.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/java.mdx
@@ -1,5 +1,6 @@
---
title: Java integration
+seoTitle: Java integration for Aspire AppHost and apps
description: Learn how to use the Aspire Java hosting integration from the Community Toolkit to run Spring Boot and other Java applications alongside your Aspire projects.
---
diff --git a/src/frontend/src/content/docs/integrations/frameworks/javascript.mdx b/src/frontend/src/content/docs/integrations/frameworks/javascript.mdx
index 454f0aad7..d5161d66f 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/javascript.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/javascript.mdx
@@ -18,7 +18,7 @@ import jsIcon from '@assets/icons/javascript.svg';
data-zoom-off
/>
-This article is the reference for the Aspire JavaScript hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to orchestrate JavaScript and TypeScript applications in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire JavaScript hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to orchestrate JavaScript and TypeScript applications in your [`AppHost`](/get-started/app-host/) project.
:::caution[Package rename]
In Aspire 13.0, `Aspire.Hosting.NodeJs` was renamed to `Aspire.Hosting.JavaScript`.
@@ -52,8 +52,8 @@ For production deployment choices, see [Deploy JavaScript apps](/deployment/java
Start with a shared builder, Docker Compose deployment target, and API resource:
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
await builder.addDockerComposeEnvironment('compose');
@@ -70,7 +70,7 @@ const apiEndpoint = await api.getEndpoint('http');
Plain Vite apps that produce static browser files use `addViteApp` and `publishAsStaticWebsite`. The `apiPath` / `apiTarget` options configure the deployed static website to proxy `/api` requests to the backend.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('vite', './frameworks/vite', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -88,7 +88,7 @@ export async function loadWeather() {
React apps created with Vite use the same static website pattern as other Vite browser apps.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('react', './frameworks/react', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -106,7 +106,7 @@ export async function loadWeather() {
Vue apps created with Vite also use `publishAsStaticWebsite`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('vue', './frameworks/vue', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -124,7 +124,7 @@ const weather = await response.json();
Static Astro apps use `addViteApp` and `publishAsStaticWebsite`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('astro', './frameworks/astro', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -135,7 +135,7 @@ await builder
Angular 17+ uses Vite internally. Use `addViteApp` with the Angular app's dev script, then publish the build output as a static website.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('angular', './frameworks/angular', { runScriptName: 'dev' })
.publishAsStaticWebsite({ apiPath: '/api', apiTarget: api })
@@ -175,7 +175,7 @@ Next.js standalone apps use the dedicated `addNextJsApp` helper, not a generic V
`AddNextJsApp` is marked `[Experimental]`. In C# AppHosts, suppress the `ASPIREJAVASCRIPT001` diagnostic when you use this API.
:::
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addNextJsApp('nextjs', './frameworks/nextjs', { runScriptName: 'dev' })
.withEnvironment('API_URL', apiEndpoint)
@@ -203,7 +203,7 @@ export default async function Home() {
Nuxt apps need `node_modules` at runtime for server-side rendering, so publish them with `publishAsNpmScript`. Set both `API_URL` for direct server-side code and `NUXT_API_URL` for Nuxt runtime config.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('nuxt', './frameworks/nuxt', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -240,7 +240,7 @@ export default defineEventHandler(async () => {
SvelteKit with `@sveltejs/adapter-node` produces a self-contained Node server artifact, so publish it with `publishAsNodeServer`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('sveltekit', './frameworks/sveltekit', { runScriptName: 'dev' })
.publishAsNodeServer('build/index.js', { outputPath: 'build' })
@@ -270,7 +270,7 @@ export const load: PageServerLoad = async ({ fetch }) => {
TanStack Start uses Nitro's Node server output and works with `publishAsNodeServer`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('tanstack-start', './frameworks/tanstack-start', {
runScriptName: 'dev',
@@ -284,7 +284,7 @@ await builder
Astro SSR apps using `@astrojs/node` need runtime dependencies, so publish them with `publishAsNpmScript`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('astro-ssr', './frameworks/astro-ssr', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -296,7 +296,7 @@ await builder
Remix / React Router apps need `node_modules` at runtime. Pass the port argument through the package script so the server listens on Aspire's assigned port.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('remix', './frameworks/remix', { runScriptName: 'dev' })
.publishAsNpmScript({
@@ -311,7 +311,7 @@ await builder
Qwik City apps need runtime dependencies and the Node server adapter, so publish them with `publishAsNpmScript`.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder
.addViteApp('qwik', './frameworks/qwik', { runScriptName: 'dev' })
.publishAsNpmScript({ startScriptName: 'start' })
@@ -321,7 +321,7 @@ await builder
After adding the framework resources your app needs, build and run the AppHost:
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await builder.build().run();
```
@@ -349,8 +349,8 @@ var frontend = builder.AddJavaScriptApp("frontend", "./frontend")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -403,8 +403,8 @@ var api = builder
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -454,8 +454,8 @@ var nextApp = builder.AddNextJsApp("next-app", "./next-app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -509,7 +509,7 @@ var nextApp = builder.AddNextJsApp("next-app", "./next-app")
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const nextApp = await builder
.addNextJsApp('next-app', './next-app')
.disableBuildValidation();
@@ -548,8 +548,8 @@ var viteApp = builder.AddViteApp("vite-app", "./vite-app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -630,8 +630,8 @@ var customApp = builder.AddJavaScriptApp("custom-app", "./custom-app")
-```typescript title="TypeScript — apphost.ts" "withNpm"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" "withNpm"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -675,8 +675,8 @@ var customApp = builder.AddJavaScriptApp("custom-app", "./custom-app")
-```typescript title="TypeScript — apphost.ts" "withYarn"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" "withYarn"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -723,8 +723,8 @@ var customApp = builder.AddJavaScriptApp("custom-app", "./custom-app")
-```typescript title="TypeScript — apphost.ts" "withPnpm"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" "withPnpm"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -767,8 +767,8 @@ var customApp = builder.AddViteApp("custom-app", "./custom-app")
-```typescript title="TypeScript — apphost.ts" "withBun"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" "withBun"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -810,8 +810,8 @@ var app = builder.AddViteApp("app", "./app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -848,8 +848,8 @@ var app = builder.AddJavaScriptApp("app", "./app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -886,8 +886,8 @@ var app = builder.AddJavaScriptApp("app", "./app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -931,8 +931,8 @@ var app = builder.AddJavaScriptApp("app", "./app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -970,8 +970,8 @@ var app = builder.AddJavaScriptApp("app", "./app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1012,8 +1012,8 @@ var viteApp = builder.AddViteApp("vite-app", "./vite-app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1057,8 +1057,8 @@ var viteApp = builder.AddViteApp("vite-app", "./vite-app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1103,8 +1103,8 @@ var viteApp = builder.AddViteApp("vite-app", "./vite-app")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1180,8 +1180,8 @@ To bridge this gap, pass the parameter to your API app as a standard environment
- ```typescript title="apphost.ts"
- import { createBuilder } from './.modules/aspire.js';
+ ```typescript title="apphost.mts"
+ import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1302,8 +1302,8 @@ var dashboard = builder.AddViteApp("dashboard", "./apps/dashboard")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1368,8 +1368,8 @@ var frontend = builder.AddJavaScriptApp("frontend", "./apps/frontend")
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/frameworks/nodejs-extensions.mdx b/src/frontend/src/content/docs/integrations/frameworks/nodejs-extensions.mdx
index 576f84877..b64354b52 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/nodejs-extensions.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/nodejs-extensions.mdx
@@ -22,7 +22,7 @@ import nodejsLightIcon from '@assets/icons/nodejs-light-icon.png';
/>
:::note
-TypeScript AppHost support for this integration is not yet available. The examples on this page show C# AppHost code only. The `withVite`, `withYarnPackageInstaller`, `withPnpmPackageInstaller`, and `withNpmPackageInstaller` APIs are absent from the generated `.modules/aspire.ts` module.
+TypeScript AppHost support for this integration is not yet available. The examples on this page show C# AppHost code only. The `withVite`, `withYarnPackageInstaller`, `withPnpmPackageInstaller`, and `withNpmPackageInstaller` APIs are absent from the generated `.aspire/modules/aspire.mjs` module.
:::
The Aspire Community Toolkit Node.js hosting extensions package provides extra functionality to the [Aspire.Hosting.JavaScript](https://www.nuget.org/packages/Aspire.Hosting.JavaScript) hosting package.
diff --git a/src/frontend/src/content/docs/integrations/frameworks/orleans.mdx b/src/frontend/src/content/docs/integrations/frameworks/orleans.mdx
index 27023ad6d..fd587f556 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/orleans.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/orleans.mdx
@@ -1,5 +1,6 @@
---
title: Orleans integration
+seoTitle: Microsoft Orleans integration for Aspire AppHost
description: Learn how to use the Aspire Orleans Hosting integration to orchestrate and configure an Orleans cluster in your Aspire solution.
---
@@ -18,7 +19,7 @@ import orleansIcon from '@assets/icons/microsoft-orleans.png';
data-zoom-off
/>
-This article is the reference for the Aspire Orleans Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model an Orleans cluster in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Orleans Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model an Orleans cluster in your [`AppHost`](/get-started/app-host/) project.
[Orleans](https://github.com/dotnet/orleans) is a cross-platform framework for building distributed applications that are elastically scalable and fault-tolerant. Unlike other Aspire integrations, the Orleans integration doesn't create a container. Instead, the Orleans service is modeled as a resource in the AppHost and its configuration is propagated to any project that references it.
@@ -94,8 +95,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -140,8 +141,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -189,8 +190,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -241,8 +242,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/frameworks/powershell.mdx b/src/frontend/src/content/docs/integrations/frameworks/powershell.mdx
index d5b528d98..eac07ec46 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/powershell.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/powershell.mdx
@@ -1,6 +1,7 @@
---
title: PowerShell integration
-description: Learn about the Aspire hosting integration for PowerShell scripts.
+seoTitle: "PowerShell integration for Aspire: hosting and client wiring"
+description: Learn about the Aspire hosting integration for PowerShell scripts — orchestrate provisioning scripts, share parameters, and run PowerShell tasks alongside your apps.
---
import { Badge } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/integrations/frameworks/python.mdx b/src/frontend/src/content/docs/integrations/frameworks/python.mdx
index e63e6b7f3..30541802a 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/python.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/python.mdx
@@ -1,5 +1,6 @@
---
title: Python integration
+seoTitle: Python integration for Aspire AppHost and apps
description: Add Python apps, modules, and ASGI services to an Aspire AppHost and orchestrate them alongside your other resources with full service discovery, environment injection, and debugging support.
---
@@ -52,8 +53,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -96,8 +97,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -137,8 +138,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -181,8 +182,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -224,8 +225,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -269,8 +270,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -322,8 +323,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -357,8 +358,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -395,8 +396,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -429,8 +430,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -464,8 +465,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -499,8 +500,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -536,8 +537,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -581,8 +582,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
@@ -648,8 +649,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from "./.modules/aspire.js";
+```typescript title="apphost.mts"
+import { createBuilder } from "./.aspire/modules/aspire.mjs";
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/frameworks/rust.mdx b/src/frontend/src/content/docs/integrations/frameworks/rust.mdx
index 52de6d495..74c06be6e 100644
--- a/src/frontend/src/content/docs/integrations/frameworks/rust.mdx
+++ b/src/frontend/src/content/docs/integrations/frameworks/rust.mdx
@@ -1,5 +1,6 @@
---
title: Rust integration
+seoTitle: Rust integration for Aspire AppHost (Community Toolkit)
description: Learn how to use the Aspire Community Toolkit hosting integration to run Rust applications alongside other resources in your AppHost project.
---
diff --git a/src/frontend/src/content/docs/integrations/gallery.mdx b/src/frontend/src/content/docs/integrations/gallery.mdx
index e197cedaa..9eb05b215 100644
--- a/src/frontend/src/content/docs/integrations/gallery.mdx
+++ b/src/frontend/src/content/docs/integrations/gallery.mdx
@@ -1,5 +1,6 @@
---
title: Integrations gallery
+seoTitle: "Aspire integrations gallery: browse all integrations"
description: Explore the Aspire gallery of integrations and extensions to enhance your Aspire solution.
tableOfContents: false
lastUpdated: false
diff --git a/src/frontend/src/content/docs/integrations/index.mdx b/src/frontend/src/content/docs/integrations/index.mdx
index 879724454..e6bd92e44 100644
--- a/src/frontend/src/content/docs/integrations/index.mdx
+++ b/src/frontend/src/content/docs/integrations/index.mdx
@@ -1,5 +1,6 @@
---
title: Aspire Integrations
+seoTitle: Aspire integrations for databases, messaging, cloud
prev:
link: /docs/
label: Foundations
diff --git a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-connect.mdx b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-connect.mdx
index 23c00f248..bec1af0b0 100644
--- a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Apache Kafka
+seoTitle: Connect to Apache Kafka from your .NET app with Aspire
description: Learn how to connect to Apache Kafka from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-get-started.mdx b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-get-started.mdx
index df863d126..f47212e9c 100644
--- a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the Apache Kafka integrations
-description: Understand why you use the Aspire Apache Kafka integrations and how they fit together.
+description: Learn how the Aspire Apache Kafka integrations host a Kafka broker resource and wire the .NET producer and consumer clients into your AppHost.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-host.mdx b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-host.mdx
index 54d8e9ad7..d242c2b4a 100644
--- a/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-host.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/apache-kafka/apache-kafka-host.mdx
@@ -17,7 +17,7 @@ import kafkaIcon from '@assets/icons/apache-kafka-icon.svg';
data-zoom-off
/>
-This article is the reference for the Aspire Apache Kafka Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Kafka resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Apache Kafka Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Kafka resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Apache Kafka integration, start with the [Get started with Apache Kafka integrations](/integrations/messaging/apache-kafka/apache-kafka-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Apache Kafka](../apache-kafka-connect/).
@@ -88,8 +88,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -134,8 +134,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -171,8 +171,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -210,8 +210,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -249,8 +249,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -284,8 +284,8 @@ var kafka = builder.ExecutionContext.IsRunMode
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -330,8 +330,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/messaging/lavinmq.mdx b/src/frontend/src/content/docs/integrations/messaging/lavinmq.mdx
index 01a399f51..85fabc2cc 100644
--- a/src/frontend/src/content/docs/integrations/messaging/lavinmq.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/lavinmq.mdx
@@ -1,5 +1,6 @@
---
title: LavinMQ integration
+seoTitle: LavinMQ integration for Aspire AppHost and apps
description: Learn how to use the Aspire LavinMQ Hosting integration to orchestrate and configure a LavinMQ resource in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/messaging/nats/nats-connect.mdx b/src/frontend/src/content/docs/integrations/messaging/nats/nats-connect.mdx
index e89a1bc7d..4a06123e3 100644
--- a/src/frontend/src/content/docs/integrations/messaging/nats/nats-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/nats/nats-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to NATS
+seoTitle: "Connect to NATS from Aspire apps (C#, Python, TypeScript)"
description: Learn how to connect to NATS from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/messaging/nats/nats-get-started.mdx b/src/frontend/src/content/docs/integrations/messaging/nats/nats-get-started.mdx
index 38eeb0570..01f9558f8 100644
--- a/src/frontend/src/content/docs/integrations/messaging/nats/nats-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/nats/nats-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the NATS integrations
-description: Understand why you use the Aspire NATS integrations and how they fit together.
+seoTitle: Get started with the Aspire NATS integration in .NET
+description: "Use the Aspire NATS hosting and client integrations to spin up NATS servers locally, share credentials, and connect from C# and TypeScript apps with health checks."
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/messaging/nats/nats-host.mdx b/src/frontend/src/content/docs/integrations/messaging/nats/nats-host.mdx
index 8957736a3..a495e8fa6 100644
--- a/src/frontend/src/content/docs/integrations/messaging/nats/nats-host.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/nats/nats-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up NATS in the AppHost
+seoTitle: "Set up NATS in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire NATS Hosting integration to orchestrate and configure a NATS resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import natsIcon from '@assets/icons/nats-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire NATS Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a NATS resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire NATS Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a NATS resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the NATS integration, start with the [Get started with NATS integrations](/integrations/messaging/nats/nats-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to NATS](../nats-connect/).
@@ -88,8 +89,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -136,8 +137,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -172,8 +173,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -213,8 +214,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -257,8 +258,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -302,8 +303,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-connect.mdx b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-connect.mdx
index 002a59d11..4bd68f8d0 100644
--- a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to RabbitMQ
+seoTitle: "Connect to RabbitMQ from Aspire apps (C# and TypeScript)"
description: Learn how to connect to RabbitMQ from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
---
diff --git a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-get-started.mdx b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-get-started.mdx
index 15f16f53d..279483230 100644
--- a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-get-started.mdx
@@ -1,6 +1,6 @@
---
title: Get started with the RabbitMQ integrations
-description: Understand why you use the Aspire RabbitMQ integrations and how they fit together.
+description: Learn how the Aspire RabbitMQ integrations provision a RabbitMQ broker resource and wire the .NET client for queues, exchanges, and consumers.
---
import { Image } from 'astro:assets';
diff --git a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-host.mdx b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-host.mdx
index 97e72e618..030709eda 100644
--- a/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-host.mdx
+++ b/src/frontend/src/content/docs/integrations/messaging/rabbitmq/rabbitmq-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up RabbitMQ in the AppHost
+seoTitle: "Set up RabbitMQ in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire RabbitMQ Hosting integration to orchestrate and configure a RabbitMQ resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import rabbitmqIcon from '@assets/icons/rabbitmq-icon.svg';
data-zoom-off
/>
-This article is the reference for the Aspire RabbitMQ Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a RabbitMQ server resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire RabbitMQ Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a RabbitMQ server resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the RabbitMQ integration, start with the [Get started with RabbitMQ integrations](/integrations/messaging/rabbitmq/rabbitmq-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to RabbitMQ](../rabbitmq-connect/).
@@ -92,8 +93,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -140,8 +141,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -179,8 +180,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -222,8 +223,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -264,8 +265,8 @@ var exampleProject = builder.AddProject("apiservice")
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -295,7 +296,7 @@ var rabbitmq = builder.AddRabbitMQ("messaging")
```
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
await rabbitmq.withManagementPlugin({ port: 15672 });
```
@@ -326,8 +327,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, EndpointProperty } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, EndpointProperty } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/observability/seq/seq-connect.mdx b/src/frontend/src/content/docs/integrations/observability/seq/seq-connect.mdx
index 94b80c709..92ce322a0 100644
--- a/src/frontend/src/content/docs/integrations/observability/seq/seq-connect.mdx
+++ b/src/frontend/src/content/docs/integrations/observability/seq/seq-connect.mdx
@@ -1,5 +1,6 @@
---
title: Connect to Seq
+seoTitle: Connect to Seq from Aspire apps for log search and dashboards
description: Learn how to connect to Seq from C#, Go, Python, and TypeScript consuming apps in an Aspire solution.
next: false
---
diff --git a/src/frontend/src/content/docs/integrations/observability/seq/seq-get-started.mdx b/src/frontend/src/content/docs/integrations/observability/seq/seq-get-started.mdx
index 634972265..3408be387 100644
--- a/src/frontend/src/content/docs/integrations/observability/seq/seq-get-started.mdx
+++ b/src/frontend/src/content/docs/integrations/observability/seq/seq-get-started.mdx
@@ -1,6 +1,7 @@
---
title: Get started with the Seq integrations
-description: Understand why you use the Aspire Seq integrations and how they fit together.
+seoTitle: Get started with the Aspire Seq integration in .NET
+description: "Use the Aspire Seq hosting and client integrations to run Seq locally, ship logs from C# and TypeScript apps, and explore structured events with built-in dashboards."
prev: false
---
diff --git a/src/frontend/src/content/docs/integrations/observability/seq/seq-host.mdx b/src/frontend/src/content/docs/integrations/observability/seq/seq-host.mdx
index 6ce989e22..25a97e486 100644
--- a/src/frontend/src/content/docs/integrations/observability/seq/seq-host.mdx
+++ b/src/frontend/src/content/docs/integrations/observability/seq/seq-host.mdx
@@ -1,5 +1,6 @@
---
title: Set up Seq in the AppHost
+seoTitle: "Set up Seq in the Aspire AppHost: hosting integration"
description: Learn how to use the Aspire Seq hosting integration to orchestrate and configure a Seq resource in an Aspire solution.
---
@@ -17,7 +18,7 @@ import seqIcon from '@assets/icons/seq-icon.png';
data-zoom-off
/>
-This article is the reference for the Aspire Seq hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a Seq server resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire Seq hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a Seq server resource in your [`AppHost`](/get-started/app-host/) project.
If you're new to the Seq integration, start with the [Get started with Seq integrations](/integrations/observability/seq/seq-get-started/) guide. For how consuming apps read the connection information this page exposes, see [Connect to Seq](../seq-connect/).
@@ -92,8 +93,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -187,8 +188,8 @@ var myService = builder.AddProject()
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder, ContainerLifetime } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder, ContainerLifetime } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/overview.mdx b/src/frontend/src/content/docs/integrations/overview.mdx
index 0ea3fc9b2..fcd69b411 100644
--- a/src/frontend/src/content/docs/integrations/overview.mdx
+++ b/src/frontend/src/content/docs/integrations/overview.mdx
@@ -1,6 +1,6 @@
---
title: What are Aspire integrations?
-description: Aspire integrations overview page, showcasing how Aspire works with various tools and platforms.
+description: Aspire integrations overview page, showcasing how Aspire works with various tools and platforms in your Aspire AppHost.
tableOfContents: true
lastUpdated: false
editUrl: false
@@ -89,8 +89,8 @@ architecture-beta
redis:R --> T:app
```
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/reverse-proxies/yarp.mdx b/src/frontend/src/content/docs/integrations/reverse-proxies/yarp.mdx
index 605f16789..346c26144 100644
--- a/src/frontend/src/content/docs/integrations/reverse-proxies/yarp.mdx
+++ b/src/frontend/src/content/docs/integrations/reverse-proxies/yarp.mdx
@@ -1,5 +1,6 @@
---
title: YARP integration
+seoTitle: YARP integration for Aspire AppHost and apps
description: Learn how to use the YARP (Yet Another Reverse Proxy) integration for reverse proxy functionality.
---
@@ -16,7 +17,7 @@ import yarpIcon from '@assets/icons/yarp-icon.svg';
data-zoom-off
/>
-This article is the reference for the Aspire YARP Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.ts` — that you use to model a [YARP (Yet Another Reverse Proxy)](https://microsoft.github.io/reverse-proxy/) resource in your [`AppHost`](/get-started/app-host/) project.
+This article is the reference for the Aspire YARP Hosting integration. It enumerates the AppHost APIs — with examples for both `AppHost.cs` and `apphost.mts` — that you use to model a [YARP (Yet Another Reverse Proxy)](https://microsoft.github.io/reverse-proxy/) resource in your [`AppHost`](/get-started/app-host/) project.
## Hosting integration
@@ -85,8 +86,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -155,8 +156,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -208,7 +209,7 @@ Routes define how incoming requests are matched and forwarded to backend service
TypeScript AppHosts use unified route helpers. Pass any supported target to `addRoute(path, target)` or `addCatchAllRoute(target)`: a YARP cluster, endpoint, service-discovery resource, external service, or URL string.
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
await gateway.withConfiguration(async (yarp) => {
const httpEndpoint = await catalogService.getEndpoint('http');
const externalApi = await builder.addExternalService(
@@ -244,7 +245,7 @@ yarp.AddRoute("/api/{**catch-all}", basketService)
-```typescript title="apphost.ts"
+```typescript title="apphost.mts"
(await yarp.addRoute('/api/{**catch-all}', basketService))
.withTransformPathRemovePrefix('/api')
.withTransformPathPrefix('/v1')
@@ -285,8 +286,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -327,8 +328,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -372,8 +373,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -412,8 +413,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -443,8 +444,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -486,8 +487,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -539,8 +540,8 @@ builder.Build().Run();
-```typescript title="apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/integrations/security/keycloak.mdx b/src/frontend/src/content/docs/integrations/security/keycloak.mdx
index ba43801b8..ba0af02b9 100644
--- a/src/frontend/src/content/docs/integrations/security/keycloak.mdx
+++ b/src/frontend/src/content/docs/integrations/security/keycloak.mdx
@@ -1,5 +1,6 @@
---
title: Keycloak integration
+seoTitle: Keycloak integration for Aspire AppHost and apps
description: Learn how to use the Keycloak integration, which includes both hosting and client integrations.
---
@@ -57,8 +58,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -125,8 +126,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -169,8 +170,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -214,8 +215,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -255,8 +256,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -294,8 +295,8 @@ builder.Build().Run();
```
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/it/index.mdx b/src/frontend/src/content/docs/it/index.mdx
index 1fdeb0dea..13a1e6b28 100644
--- a/src/frontend/src/content/docs/it/index.mdx
+++ b/src/frontend/src/content/docs/it/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 è disponibile! — Scopri le novità di Aspire 13.3.
+ 🚀 Aspire 13.4 è disponibile! — Scopri le novità di Aspire 13.4.
hero:
tagline: Il tuo stack, semplificato.
Orchestra frontend, API, container e database senza sforzo—senza riscritture, senza limiti. Estendi Aspire per potenziare qualsiasi progetto.
프론트엔드, API, 컨테이너, 데이터베이스를 손쉽게 오케스트레이션—재작성 불필요, 무한한 가능성. Aspire를 확장하여 모든 프로젝트를 강화하세요.
image:
diff --git a/src/frontend/src/content/docs/languages-and-runtimes/index.mdx b/src/frontend/src/content/docs/languages-and-runtimes/index.mdx
index d9be3b222..d01a2ca70 100644
--- a/src/frontend/src/content/docs/languages-and-runtimes/index.mdx
+++ b/src/frontend/src/content/docs/languages-and-runtimes/index.mdx
@@ -1,6 +1,7 @@
---
title: Languages & runtimes
-description: Learn how Aspire works across AppHost languages, app languages, and runtime ecosystems, and find the right starting point for your stack.
+seoTitle: Aspire languages and runtimes overview for AppHost authors
+description: "Learn how Aspire works across AppHost languages, app languages, and runtime ecosystems — and find the right starting point for C#, TypeScript, Python, Java, and more."
---
import { Aside, Card, CardGrid } from '@astrojs/starlight/components';
@@ -62,17 +63,17 @@ The sections below use the labels that are most helpful when you're trying to an
Start with [Python integration](/integrations/frameworks/python/) and [Standalone Aspire dashboard for Python](/dashboard/standalone-for-python/).
-
-
-### Community Toolkit guides
-
- Add Go services through the Community Toolkit.
+ Use Aspire with Go services and the local Go toolchain.
- Start with [Go integration](/integrations/frameworks/go-apps/).
+ Start with [Go integration](/integrations/frameworks/go/go-get-started/).
+
+
+### Community Toolkit guides
+
Add Java services through the Community Toolkit.
diff --git a/src/frontend/src/content/docs/pt-br/index.mdx b/src/frontend/src/content/docs/pt-br/index.mdx
index 2818c33a9..9a9767427 100644
--- a/src/frontend/src/content/docs/pt-br/index.mdx
+++ b/src/frontend/src/content/docs/pt-br/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 foi lançado! — Veja o que há de novo no Aspire 13.3.
+ 🚀 Aspire 13.4 foi lançado! — Veja o que há de novo no Aspire 13.4.
hero:
tagline: Seu stack, simplificado.
Orquestre frontends, APIs, contêineres e bancos de dados sem esforço—sem reescritas, sem limites. Estenda o Aspire para impulsionar qualquer projeto.
image:
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-add.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-add.mdx
index 73d2812f3..1188a6b8e 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-add.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-add.mdx
@@ -1,5 +1,6 @@
---
title: aspire add command
+seoTitle: aspire add command reference for the Aspire CLI
description: Learn about the aspire add command and its usage. This command adds an integration package to an Aspire AppHost project.
---
@@ -21,7 +22,11 @@ aspire add [] [options]
## Description
-The `aspire add` command searches for an integration package and adds it to the Aspire AppHost.
+The `aspire add` command searches for an integration package and adds it to the Aspire AppHost. The persisted change depends on the AppHost style:
+
+- Project-based C# AppHosts receive a package reference.
+- File-based C# AppHosts receive a `#:package` directive.
+- TypeScript AppHosts receive an entry in the `packages` section of `aspire.config.json`, then the generated `.aspire/modules/` TypeScript SDK is regenerated.
@@ -74,3 +79,9 @@ The following options are available:
```bash title="Aspire CLI"
aspire add kafka --version 13.3.0
```
+
+- Add the **redis** integration to a TypeScript AppHost and regenerate `.aspire/modules/`:
+
+ ```bash title="Aspire CLI"
+ aspire add redis --apphost './apphost.mts'
+ ```
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-agent.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-agent.mdx
index 06d48305b..2f843ab59 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-agent.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-agent.mdx
@@ -1,5 +1,6 @@
---
title: aspire agent command
+seoTitle: aspire agent command reference for the Aspire CLI
description: Learn about the aspire agent command and its usage. This command driver manages AI agent integrations, Aspire skill files, and MCP (Model Context Protocol) server operations.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-cache.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-cache.mdx
index 222f79373..ef219161e 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-cache.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-cache.mdx
@@ -1,5 +1,6 @@
---
title: aspire cache command
+seoTitle: aspire cache command reference for the Aspire CLI
description: Learn about the aspire cache command and its usage. This command driver is used to manage disk cache for Aspire CLI operations.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-certs.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-certs.mdx
index d045e84a0..ef30fc685 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-certs.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-certs.mdx
@@ -1,5 +1,6 @@
---
title: aspire certs command
+seoTitle: aspire certs command reference for the Aspire CLI
description: Learn about the aspire certs command and its usage. This command manages HTTPS development certificates.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-do.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-do.mdx
index 00af88f7d..9dd98291b 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-do.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-do.mdx
@@ -1,5 +1,6 @@
---
title: aspire do command
+seoTitle: aspire do command reference for the Aspire CLI
description: Learn about the aspire do command and its usage. This command executes a specific pipeline step and its dependencies.
sidebar:
badge: Preview
@@ -95,15 +96,15 @@ The following options are available:
Before executing a pipeline step, you can discover what steps are available in your application's pipeline and understand their dependencies. Aspire provides two complementary tools for this:
-- `aspire do --list-steps` — a quick, compact listing of every pipeline step with its direct dependencies and tags. Available on `aspire deploy`, `aspire publish`, `aspire destroy`, and `aspire do`. Useful for a fast "what would happen?" view before running a command.
+- `--list-steps` — a quick, compact listing of the steps the selected pipeline command would inspect or execute, with each step's direct dependencies and tags. Use it as `aspire deploy --list-steps`, `aspire publish --list-steps`, `aspire destroy --list-steps`, or `aspire do --list-steps`; the `aspire do` form always requires the target ``. Useful for a fast "what would happen?" view before running a command.
- `aspire do diagnostics` — a verbose, in-depth report. The `diagnostics` step is itself part of the pipeline, so `aspire do diagnostics` runs it like any other step.
### Quick listing with `--list-steps`
-Running `aspire do --list-steps` produces a numbered list of every step in the pipeline, what each one depends on, and any tags it carries:
+The `--list-steps` option requires a `step` argument when used with `aspire do`. Pass the name of the step you want to inspect — for example `deploy` or `publish` — to list the target step and its transitive dependencies, along with each step's direct dependencies and tags. In typical pipelines, listing from `deploy` covers the deployment graph; listing from a leaf step shows only that step.
```bash title="Aspire CLI"
-aspire do --list-steps
+aspire do deploy --list-steps
```
Example output:
@@ -164,10 +165,10 @@ The following examples demonstrate common pipeline operations:
- Quickly list the steps in your pipeline:
```bash title="Aspire CLI"
- aspire do --list-steps
+ aspire do deploy --list-steps
```
- This displays a compact view of every step with its dependencies and tags. Use it for a fast "what would happen?" check before running a pipeline command.
+ Pass any well-known step name (such as `deploy` or `publish`) to display a compact view of that step and its transitive dependencies, with each step's direct dependencies and tags. The `step` argument is required; omitting it returns a friendly error that suggests the correct form. Use this for a fast "what would happen?" check before running a pipeline command.
- Run the `diagnostics` step for an in-depth report:
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-docs.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-docs.mdx
index aa15db771..3650df97f 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-docs.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-docs.mdx
@@ -1,5 +1,6 @@
---
title: aspire docs command
+seoTitle: aspire docs command reference for the Aspire CLI
description: Learn about the aspire docs command and its usage. This command is used to browse and search Aspire documentation from aspire.dev.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx
index 9a3210824..716fafd99 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-init.mdx
@@ -1,5 +1,6 @@
---
title: aspire init command
+seoTitle: aspire init command reference for the Aspire CLI
description: Learn about the aspire init command and how it uses the aspireify agent skill to wire up Aspire support in an existing codebase.
---
@@ -34,7 +35,7 @@ The `--source` and `--version` options are deprecated and no longer affect `aspi
The command adapts to the repo it finds:
- **C# file-based AppHost** (when selected interactively) — creates `apphost.cs` with `#:sdk` and `#:package` directives for a lightweight single-file orchestrator.
-- **TypeScript AppHost** (when selected interactively) — creates `apphost.ts` with the generated `.modules/` folder.
+- **TypeScript AppHost** (when selected interactively) — creates `apphost.mts` with the generated `.aspire/modules/` folder. If the repo already has a root `package.json`, the AppHost is created as a nested `aspire-apphost/` package and the root `aspire.config.json` points to `aspire-apphost/apphost.mts`.
:::note
When a `.sln` or `.slnx` is present, the C# option creates a **project-based AppHost** instead — an `AppHost.csproj` added to the solution with `ProjectReference` items and strongly-typed `AddProject()` calls.
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-logs.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-logs.mdx
index b52c48714..8d1292bbc 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-logs.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-logs.mdx
@@ -1,5 +1,6 @@
---
title: aspire logs command
+seoTitle: aspire logs command reference for the Aspire CLI
description: Learn about the aspire logs command and its usage. This command displays logs from resources in a running apphost.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-mcp.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-mcp.mdx
index 6015fbd42..3acd9fc2c 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-mcp.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-mcp.mdx
@@ -1,5 +1,6 @@
---
title: aspire mcp command
+seoTitle: aspire mcp command reference for the Aspire CLI
description: Learn about the aspire mcp command and its usage. This command interacts with MCP tools exposed by Aspire resources.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-new.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-new.mdx
index 70c5d161a..4e015290d 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-new.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-new.mdx
@@ -1,5 +1,6 @@
---
title: aspire new command
+seoTitle: aspire new command reference for the Aspire CLI
description: Learn about the aspire new command and its usage. This command creates new Aspire projects or solutions.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-otel.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-otel.mdx
index 5bd3f6629..55100dd02 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-otel.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-otel.mdx
@@ -1,5 +1,6 @@
---
title: aspire otel command
+seoTitle: aspire otel command reference for the Aspire CLI
description: Learn about the aspire otel command and its usage. This command is used to view OpenTelemetry data (logs, spans, traces) from a running apphost.
sidebar:
badge: Preview
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-ps.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-ps.mdx
index 2be199ac3..4a38cfa41 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-ps.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-ps.mdx
@@ -1,5 +1,6 @@
---
title: aspire ps command
+seoTitle: aspire ps command reference for the Aspire CLI
description: Learn about the aspire ps command which lists all running Aspire AppHost processes with their process IDs and dashboard URLs.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-resource.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-resource.mdx
index 0defa4115..72671ce29 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-resource.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-resource.mdx
@@ -13,7 +13,8 @@ import { Aside, Steps } from '@astrojs/starlight/components';
## Synopsis
```bash title="Aspire CLI"
-aspire resource [options]
+aspire resource [command-options] [options]
+aspire resource -- [command-options]
```
## Description
@@ -30,6 +31,68 @@ selected resource at runtime. This is why the CLI reference documents
`aspire resource start`.
+### Command arguments as named options
+
+When a resource command defines arguments, those arguments are passed as **named options** on the command line. Named options make it easier to supply only the arguments you need, skip optional ones, and pass values in any order.
+
+To see what arguments a specific command accepts, use the command-specific `--help` flag:
+
+```bash title="Aspire CLI"
+aspire resource --help
+```
+
+The help output lists each argument with its type, whether it's required, its default value (if any), and the set of allowed values for choice arguments. For example:
+
+```console
+Echo a message with text, number, boolean, choice, and secret command arguments.
+
+Usage:
+ aspire resource [command-options] [options]
+ aspire resource -- [command-options]
+
+Command options:
+ --message Text value to echo. Required.
+ --repeat How many times to echo the message. Default: 1.
+ --shout Uppercase the echoed message. Default: false.
+ --flavor The message flavor. Allowed values: vanilla, chocolate, strawberry. Default: vanilla.
+ --secret Secret text command argument. The command only returns its length.
+
+Options:
+ --apphost The path to the Aspire AppHost file or a directory to search
+ -?, -h, --help Show help and usage information
+```
+
+#### Handling option name collisions
+
+If a command argument name conflicts with an Aspire CLI option (such as `--apphost`), use `--` to separate Aspire CLI options from command-specific options:
+
+```bash title="Aspire CLI"
+aspire resource --apphost './MyApp.AppHost.cs' -- --apphost myvalue
+```
+
+Everything after `--` is treated as command argument options and is not parsed as Aspire CLI flags.
+
+### Discovering available resource commands
+
+Running `aspire resource --help` with a specific resource name queries the running AppHost and appends an **Available resource commands** section to the help output. This lets you discover what commands a resource supports without opening the dashboard.
+
+```text title="Example output"
+Available resource commands:
+ restart Restart the resource.
+ start Start the resource.
+ stop Stop the resource.
+```
+
+If no single in-scope AppHost can be determined without an explicit `--apphost`, the resource-scoped help is shown without the commands section rather than prompting for AppHost selection.
+
+To pass `--help` as an argument to the resource command itself (rather than as a CLI help flag), separate it with `--`:
+
+```bash title="Aspire CLI"
+aspire resource myresource mycommand -- --help
+```
+
+### AppHost selection
+
When executed without the `--apphost` option, the command:
@@ -55,10 +118,16 @@ When executed without the `--apphost` option, the command:
The following options are available:
--
+- **`--apphost `**
+
+ The path to the Aspire AppHost file or a directory to search.
-
+- **`--include-hidden`**
+
+ Includes resource commands that are marked as hidden. By default, hidden commands are not shown in help output or executed. Use this option to expose and run commands that are intentionally hidden from the default command listing.
+
-
-
@@ -83,10 +152,58 @@ The following options are available:
aspire resource worker stop
```
-- Target a specific AppHost project:
+- Target a specific AppHost file:
+
+ ```bash title="Aspire CLI"
+ # C# AppHost
+ aspire resource api restart --apphost './apphost.cs'
+
+ # TypeScript AppHost
+ aspire resource api restart --apphost './apphost.mts'
+ ```
+
+- List available commands for a specific resource:
+
+ ```bash title="Aspire CLI"
+ # C# AppHost
+ aspire resource myapi --help --apphost './apphost.cs'
+
+ # TypeScript AppHost
+ aspire resource myapi --help --apphost './apphost.mts'
+ ```
+
+- Include hidden commands when listing available commands:
+
+ ```bash title="Aspire CLI"
+ # C# AppHost
+ aspire resource myapi --help --include-hidden --apphost './apphost.cs'
+
+ # TypeScript AppHost
+ aspire resource myapi --help --include-hidden --apphost './apphost.mts'
+ ```
+
+- Show command-specific help for a resource command with arguments:
+
+ ```bash title="Aspire CLI"
+ aspire resource my-resource echo-message --help
+ ```
+
+- Execute a resource command with named arguments:
+
+ ```bash title="Aspire CLI"
+ aspire resource my-resource echo-message --message "hello" --repeat 3 --shout true
+ ```
+
+- Supply only some optional command arguments (skipping others):
+
+ ```bash title="Aspire CLI"
+ aspire resource my-resource echo-message --message "hello" --flavor chocolate
+ ```
+
+- Use `--` to avoid conflict with an Aspire CLI option named `--apphost`:
```bash title="Aspire CLI"
- aspire resource api restart --apphost './src/MyApp.AppHost/MyApp.AppHost.csproj'
+ aspire resource my-resource custom-cmd --apphost './apphost.mts' -- --apphost myvalue
```
## See also
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-restore.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-restore.mdx
index d05341a55..74ec200a2 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-restore.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-restore.mdx
@@ -17,7 +17,9 @@ aspire restore [options]
## Description
-The `aspire restore` command restores the AppHost project and generates the SDK code that Aspire uses for resources, integrations, and tooling. Use it when you want to make restore an explicit step in automation or validate that the AppHost can restore cleanly without starting it.
+The `aspire restore` command restores the AppHost and generates the SDK code that Aspire uses for resources, integrations, and tooling. Use it when you want to make restore an explicit step in automation or validate that the AppHost can restore cleanly without starting it.
+
+For TypeScript AppHosts, restore reads the `packages` section in `aspire.config.json`, restores those hosting integration packages, and regenerates the `.aspire/modules/` TypeScript SDK imported by `apphost.mts`. This is useful after running `aspire add`, switching branches, updating pinned package versions, or restoring dependencies in CI before `aspire run`, `aspire publish`, or deployment workflows.
@@ -55,6 +57,12 @@ The following options are available:
aspire restore --apphost './src/MyApp.AppHost/MyApp.AppHost.csproj'
```
+- Restore a specific TypeScript AppHost and regenerate `.aspire/modules/`:
+
+ ```bash title="Aspire CLI"
+ aspire restore --apphost './apphost.mts'
+ ```
+
## See also
- [aspire run](../aspire-run/)
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-run.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-run.mdx
index 66d7e81d3..09df61a78 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-run.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-run.mdx
@@ -1,6 +1,7 @@
---
title: aspire run command
-description: Learn about the aspire run command and its usage. This command runs an Aspire AppHost.
+seoTitle: aspire run command reference for the Aspire CLI
+description: Learn about the aspire run command, which builds and runs an Aspire AppHost project locally and streams logs and telemetry to your terminal.
---
import AsciinemaPlayer from '@components/AsciinemaPlayer.astro';
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-start.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-start.mdx
index 69af3fcb6..e06665335 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-start.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-start.mdx
@@ -1,5 +1,6 @@
---
title: aspire start command
+seoTitle: aspire start command reference for the Aspire CLI
description: Learn about the aspire start command and its usage. This command starts an apphost in the background.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-stop.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-stop.mdx
index 38e3622f1..17a431cff 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-stop.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-stop.mdx
@@ -1,6 +1,7 @@
---
title: aspire stop command
-description: Learn about the aspire stop command which stops a running Aspire AppHost process.
+seoTitle: aspire stop command reference for the Aspire CLI
+description: Learn about the aspire stop command, which gracefully stops a running Aspire AppHost process so resources are torn down in the correct order.
---
import AsciinemaPlayer from '@components/AsciinemaPlayer.astro';
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
index 9bde62a00..ab848ffc9 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-update.mdx
@@ -33,9 +33,43 @@ The command performs the following:
- Detects outdated Aspire NuGet packages in your project
- Respects your configured Aspire channel (preview, stable, etc.)
- Resolves diamond dependencies to avoid duplicate updates
-- Validates package compatibility before applying changes
+- Applies all package version edits before running a single final `dotnet restore`, so channel switches that add NuGet source mappings don't cause restore failures mid-update
- Provides colorized output with detailed summary of changes
+### Non-interactive usage
+
+When you use `--non-interactive`, also pass `--yes` to explicitly confirm the update operation. Omitting `--yes` when using `--non-interactive` is an error:
+
+```bash title="Aspire CLI"
+aspire update --yes --non-interactive
+```
+
+If you specify `--non-interactive` without `--yes`, the command exits with an error:
+
+```text title="Output"
+The update command requires --yes when the --non-interactive option is specified.
+```
+
+### Updating guest AppHost projects
+
+When updating a guest AppHost project, such as a TypeScript AppHost, `aspire update` checks the selected Aspire SDK version before modifying files. If the selected SDK is newer than the running Aspire CLI, the command prompts you to update the CLI first:
+
+```text title="Output"
+The selected Aspire SDK is newer than this Aspire CLI. Update the Aspire CLI now and re-run `aspire update` to update this project?
+```
+
+If you confirm, the CLI updates itself and skips the project update. When the CLI is installed as a .NET tool, the command prints the `dotnet tool update` command to run manually instead:
+
+```text title="Output"
+Project update skipped. Update the Aspire CLI, then re-run `aspire update`.
+```
+
+After updating the CLI, re-run `aspire update` to complete the project update. This check helps prevent a guest AppHost project from being left in a broken state when the CLI's bundled code generator doesn't support the selected SDK version.
+
+:::tip
+To update the CLI without being prompted, run `aspire update --self` before running `aspire update` on a guest AppHost project.
+:::
+
## Options
The following options are available:
@@ -48,7 +82,7 @@ The following options are available:
- **`--channel`**
- Channel to update to (`stable`, `staging`, `daily`).
+ Channel to update to (`stable`, `staging`, `daily`). When switching channels, `aspire update` applies all package version edits to your project first and then runs a single `dotnet restore`, ensuring that NuGet source mappings added for the target channel are in place before any restore is attempted.
- **`-y, --yes`**
@@ -95,3 +129,9 @@ The following options are available:
```bash title="Aspire CLI"
aspire update --nuget-config-dir './config'
```
+
+- Update packages to the daily preview channel:
+
+ ```bash title="Aspire CLI"
+ aspire update --channel daily
+ ```
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire-wait.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire-wait.mdx
index 26982b6d1..8cf64842a 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire-wait.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire-wait.mdx
@@ -1,5 +1,6 @@
---
title: aspire wait command
+seoTitle: aspire wait command reference for the Aspire CLI
description: Learn about the aspire wait command which blocks until a named resource reaches a target status, with a configurable timeout.
---
diff --git a/src/frontend/src/content/docs/reference/cli/commands/aspire.mdx b/src/frontend/src/content/docs/reference/cli/commands/aspire.mdx
index 887c5e34c..e112cf6cc 100644
--- a/src/frontend/src/content/docs/reference/cli/commands/aspire.mdx
+++ b/src/frontend/src/content/docs/reference/cli/commands/aspire.mdx
@@ -1,6 +1,7 @@
---
title: aspire command
-description: Learn about the aspire command (the generic driver for the Aspire CLI) and its usage.
+seoTitle: aspire root command reference for the Aspire CLI
+description: Learn about the aspire command, the generic driver for the Aspire CLI used to run, deploy, and manage AppHost projects from the terminal.
---
import Include from '@components/Include.astro';
diff --git a/src/frontend/src/content/docs/reference/cli/configuration.mdx b/src/frontend/src/content/docs/reference/cli/configuration.mdx
index d48928542..9dbc489cc 100644
--- a/src/frontend/src/content/docs/reference/cli/configuration.mdx
+++ b/src/frontend/src/content/docs/reference/cli/configuration.mdx
@@ -26,7 +26,7 @@ focuses on the settings surfaced through `aspire config`.
{
"$schema": "https://aspire.dev/reference/cli/configuration/schema.json",
"appHost": {
- "path": "./apphost.ts"
+ "path": "./apphost.mts"
},
"channel": "staging",
"features": {
@@ -73,7 +73,7 @@ top-level `$schema` property:
{
"$schema": "https://aspire.dev/reference/cli/configuration/schema.json",
"appHost": {
- "path": "./apphost.ts"
+ "path": "./apphost.mts"
}
}
```
@@ -113,7 +113,7 @@ Use `appHost.path` to set the default AppHost entry point for the current
configuration root:
```bash title="Set the local AppHost path"
-aspire config set appHost.path ./apphost.ts
+aspire config set appHost.path ./apphost.mts
```
The CLI writes this value to the local `aspire.config.json` file:
@@ -121,13 +121,13 @@ The CLI writes this value to the local `aspire.config.json` file:
```json title="aspire.config.json"
{
"appHost": {
- "path": "./apphost.ts"
+ "path": "./apphost.mts"
}
}
```
The AppHost path can point to the entry point used by your AppHost language, such
-as `apphost.ts`, `Program.cs`, or an AppHost project file. The path is
+as `apphost.mts`, `Program.cs`, or an AppHost project file. The path is
project-specific and can't be configured globally. If a global settings file
contains `appHost.path` or the legacy `appHostPath` key, the CLI ignores that
value and warns that AppHost paths must be configured locally. The legacy
diff --git a/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md b/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md
index 219177173..a8a23dbf6 100644
--- a/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md
+++ b/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md
@@ -7,7 +7,6 @@ title: Config Settings Table
| `appHost.path` | `appHost.path` | Project-scoped path to the default AppHost entry point. This setting must be configured in the local `aspire.config.json` file. |
| `channel` | `channel` | Default Aspire channel used by channel-aware commands such as `aspire new`, `aspire init`, and `aspire update`. |
| `features.defaultWatchEnabled` | `features.defaultWatchEnabled` | Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes. |
-| `features.execCommandEnabled` | `features.execCommandEnabled` | Enable or disable the legacy `aspire exec` command for executing commands inside running resources. |
| `features.experimentalPolyglot:go` | `features.experimentalPolyglot:go` | Enable or disable experimental Go language support for polyglot Aspire applications. |
| `features.experimentalPolyglot:java` | `features.experimentalPolyglot:java` | Enable or disable experimental Java language support for polyglot Aspire applications. |
| `features.experimentalPolyglot:python` | `features.experimentalPolyglot:python` | Enable or disable experimental Python language support for polyglot Aspire applications. |
diff --git a/src/frontend/src/content/docs/reference/cli/includes/option-project.md b/src/frontend/src/content/docs/reference/cli/includes/option-project.md
index 1acd4580f..4f5370f91 100644
--- a/src/frontend/src/content/docs/reference/cli/includes/option-project.md
+++ b/src/frontend/src/content/docs/reference/cli/includes/option-project.md
@@ -4,4 +4,4 @@ title: Option AppHost
**`--apphost `**
-The path to the Aspire AppHost project file.
+The path to the Aspire AppHost file or project file, such as `apphost.mts`, `apphost.cs`, or an AppHost `.csproj`.
diff --git a/src/frontend/src/content/docs/reference/cli/install-script.mdx b/src/frontend/src/content/docs/reference/cli/install-script.mdx
index 51326bc66..9614eb4c8 100644
--- a/src/frontend/src/content/docs/reference/cli/install-script.mdx
+++ b/src/frontend/src/content/docs/reference/cli/install-script.mdx
@@ -1,5 +1,6 @@
---
title: Install script
+seoTitle: Aspire CLI install script for Windows, macOS, and Linux
description: Learn about the aspire-install scripts to install the Aspire CLI. Use the Aspire CLI to create, run, and manage Aspire solutions.
---
diff --git a/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx b/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
index a04dfdd49..48c954dbd 100644
--- a/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
+++ b/src/frontend/src/content/docs/reference/cli/microsoft-collected-cli-telemetry.mdx
@@ -1,6 +1,6 @@
---
title: Microsoft-collected CLI telemetry
-description: Learn about what telemetry the Aspire CLI collects and how to opt out.
+description: Learn what telemetry the Aspire CLI collects, how the data is used to improve the product, and how to opt out using environment variables or CLI configuration.
---
import OsAwareTabs from '@components/OsAwareTabs.astro';
diff --git a/src/frontend/src/content/docs/reference/cli/overview.mdx b/src/frontend/src/content/docs/reference/cli/overview.mdx
index d8e546f69..785944bcf 100644
--- a/src/frontend/src/content/docs/reference/cli/overview.mdx
+++ b/src/frontend/src/content/docs/reference/cli/overview.mdx
@@ -1,5 +1,7 @@
---
title: Aspire CLI overview
+description: Overview of the Aspire CLI, the cross-platform terminal tool for creating, running, and deploying Aspire AppHost projects from your shell.
+seoTitle: "Aspire CLI overview: commands, options, and workflows"
---
import { Aside, CardGrid, LinkCard } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/reference/overview.mdx b/src/frontend/src/content/docs/reference/overview.mdx
index e7b7eab1b..465e87c59 100644
--- a/src/frontend/src/content/docs/reference/overview.mdx
+++ b/src/frontend/src/content/docs/reference/overview.mdx
@@ -1,5 +1,6 @@
---
title: Aspire Reference
+seoTitle: "Aspire reference: APIs, CLI, and packages"
prev:
link: /deployment/
label: Deployment
diff --git a/src/frontend/src/content/docs/reference/samples.mdx b/src/frontend/src/content/docs/reference/samples.mdx
index 957c4dbfe..bc796cf0b 100644
--- a/src/frontend/src/content/docs/reference/samples.mdx
+++ b/src/frontend/src/content/docs/reference/samples.mdx
@@ -1,5 +1,6 @@
---
title: Samples
+seoTitle: Aspire samples and reference solutions
description: Explore Aspire sample projects — fully functional apps demonstrating real-world patterns, integrations, and best practices.
tableOfContents: false
lastUpdated: false
diff --git a/src/frontend/src/content/docs/ru/index.mdx b/src/frontend/src/content/docs/ru/index.mdx
index c7c4b5b1b..84f4d90ec 100644
--- a/src/frontend/src/content/docs/ru/index.mdx
+++ b/src/frontend/src/content/docs/ru/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 выпущен! — Что нового в Aspire 13.3.
+ 🚀 Aspire 13.4 выпущен! — Что нового в Aspire 13.4.
hero:
tagline: Ваш стек, упрощён.
Оркестрируйте фронтенды, API, контейнеры и базы данных без усилий—без переписывания, без ограничений. Расширяйте Aspire для любого проекта.
image:
diff --git a/src/frontend/src/content/docs/support.mdx b/src/frontend/src/content/docs/support.mdx
index 01d6ce067..67fcb5574 100644
--- a/src/frontend/src/content/docs/support.mdx
+++ b/src/frontend/src/content/docs/support.mdx
@@ -1,8 +1,8 @@
---
-title: Aspire support policy
+title: Aspire support policy and lifecycle
prev: false
next: false
-description: Official support policy for Aspire - lifecycle, release cadence, and support guidelines.
+description: "Review the official Aspire support policy: release cadence, lifecycle dates, and Microsoft Modern Lifecycle guidance for production deployments and upgrades."
template: splash
editUrl: false
---
diff --git a/src/frontend/src/content/docs/testing/accessing-resources.mdx b/src/frontend/src/content/docs/testing/accessing-resources.mdx
index e2034b235..e93608236 100644
--- a/src/frontend/src/content/docs/testing/accessing-resources.mdx
+++ b/src/frontend/src/content/docs/testing/accessing-resources.mdx
@@ -1,6 +1,7 @@
---
title: Access resources in tests
-description: Learn how to access the resources from the Aspire AppHost in your tests.
+seoTitle: Access Aspire resources from integration tests using xUnit
+description: Resolve and inspect Aspire AppHost resources from your tests — connection strings, endpoints, HTTP clients, and service discovery URIs for integration scenarios.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/testing/advanced-scenarios.mdx b/src/frontend/src/content/docs/testing/advanced-scenarios.mdx
index 0d88c6423..52fd7f033 100644
--- a/src/frontend/src/content/docs/testing/advanced-scenarios.mdx
+++ b/src/frontend/src/content/docs/testing/advanced-scenarios.mdx
@@ -1,6 +1,7 @@
---
title: Advanced testing scenarios
-description: Learn advanced patterns for using DistributedApplicationTestingBuilder, including selectively disabling resources, overriding environment variables, and customizing the test AppHost.
+seoTitle: Advanced Aspire integration testing scenarios for AppHost
+description: Advanced patterns for DistributedApplicationTestingBuilder — selectively disabling resources, overriding configuration, and authoring resilient Aspire integration tests.
---
import { Aside } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/testing/manage-app-host.mdx b/src/frontend/src/content/docs/testing/manage-app-host.mdx
index d1bfae9d7..e43a5c9cc 100644
--- a/src/frontend/src/content/docs/testing/manage-app-host.mdx
+++ b/src/frontend/src/content/docs/testing/manage-app-host.mdx
@@ -1,6 +1,7 @@
---
title: Manage the AppHost in tests
-description: Learn how to manage the AppHost in Aspire tests.
+seoTitle: Manage the Aspire AppHost lifecycle in integration tests
+description: Manage the Aspire AppHost lifecycle in your tests — start, dispose, and configure DistributedApplicationTestingBuilder for fast, repeatable integration runs.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/testing/overview.mdx b/src/frontend/src/content/docs/testing/overview.mdx
index ea623d4d6..8fa306393 100644
--- a/src/frontend/src/content/docs/testing/overview.mdx
+++ b/src/frontend/src/content/docs/testing/overview.mdx
@@ -1,6 +1,7 @@
---
title: Testing overview
-description: Learn how to write integration tests for your Aspire applications using the Aspire.Hosting.Testing package.
+seoTitle: Aspire integration testing overview for distributed apps
+description: Write integration tests for your Aspire applications using the Aspire.Hosting.Testing package — spin up the AppHost, resolve resources, and verify end-to-end behavior.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/testing/testing-in-ci.mdx b/src/frontend/src/content/docs/testing/testing-in-ci.mdx
index 33cdc4a41..51ac4d3c5 100644
--- a/src/frontend/src/content/docs/testing/testing-in-ci.mdx
+++ b/src/frontend/src/content/docs/testing/testing-in-ci.mdx
@@ -1,6 +1,7 @@
---
title: Testing in CI/CD pipelines
-description: Learn how to run Aspire integration tests reliably in CI/CD environments, such as GitHub Actions and Azure DevOps, covering timeout configuration, Azure authentication, and container requirements.
+seoTitle: Test Aspire AppHost projects in CI/CD pipelines with xUnit
+description: Run Aspire integration tests reliably in CI/CD — GitHub Actions, Azure DevOps, container runtimes, port allocation, and managing flaky distributed application tests.
---
import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/testing/write-your-first-test.mdx b/src/frontend/src/content/docs/testing/write-your-first-test.mdx
index c8b2ef228..4c62a68e4 100644
--- a/src/frontend/src/content/docs/testing/write-your-first-test.mdx
+++ b/src/frontend/src/content/docs/testing/write-your-first-test.mdx
@@ -1,6 +1,7 @@
---
title: Write your first test
-description: Learn how to test your Aspire solutions using xUnit.net, NUnit, and MSTest testing frameworks.
+seoTitle: Write your first Aspire integration test with xUnit
+description: Test your Aspire solutions using xUnit.net, NUnit, or MSTest — wire up DistributedApplicationTestingBuilder, start the AppHost, and assert on resources from your tests.
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/tr/index.mdx b/src/frontend/src/content/docs/tr/index.mdx
index 922ddcedd..8b5b18015 100644
--- a/src/frontend/src/content/docs/tr/index.mdx
+++ b/src/frontend/src/content/docs/tr/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 yayınlandı! — Aspire 13.3'deki yeniliklere bakın.
+ 🚀 Aspire 13.4 yayınlandı! — Aspire 13.4'deki yeniliklere bakın.
hero:
tagline: Yığınınız basitleştirildi.
Frontend'leri, API'leri, konteynerleri ve veritabanlarını zahmetsizce orkestre edin—yeniden yazma yok, sınır yok. Her projeyi güçlendirmek için Aspire'ı genişletin.
image:
diff --git a/src/frontend/src/content/docs/uk/index.mdx b/src/frontend/src/content/docs/uk/index.mdx
index 972b7a6e2..620584f46 100644
--- a/src/frontend/src/content/docs/uk/index.mdx
+++ b/src/frontend/src/content/docs/uk/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 випущено! — Що нового в Aspire 13.3.
+ 🚀 Aspire 13.4 випущено! — Що нового в Aspire 13.4.
hero:
tagline: Ваш стек спрощено.
Оркеструйте фронтенди, API, контейнери та бази даних без зусиль—без переписування, без обмежень. Розширюйте Aspire для будь-якого проєкту.
image:
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-1.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-1.mdx
index 356d0a833..d469d62a3 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13-1.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-1.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 13.1
-description: Aspire 13.1 delivers comprehensive MCP support for AI coding agents, CLI enhancements with channel persistence, dashboard improvements, Azure Managed Redis, container registry support, and numerous bug fixes.
+title: "What's new in Aspire 13.1"
+description: "Explore Aspire 13.1: comprehensive MCP support for AI coding agents, CLI channel persistence, dashboard improvements, Azure Managed Redis, and container registry updates."
sidebar:
label: Aspire 13.1
order: 0
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-2.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-2.mdx
index 9a22a372f..3572b5afc 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13-2.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-2.mdx
@@ -352,7 +352,7 @@ Aspire now also prefers a single `aspire.config.json` file that combines apphost
```json title="JSON — aspire.config.json"
{
"appHost": {
- "path": "apphost.ts",
+ "path": "apphost.mts",
"language": "typescript/nodejs"
},
"sdk": {
@@ -454,8 +454,8 @@ One of the most anticipated features in Aspire 13.2 is support for writing your
TypeScript apphosts use the same app model as C#—resources, references, integrations—expressed in idiomatic TypeScript via `createBuilder()`:
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -471,7 +471,7 @@ Under the hood, this runs as a guest process alongside Aspire's .NET orchestrati
### Code generation
-When you run `aspire add`, the CLI inspects the integration's .NET assembly and generates a TypeScript SDK into `.modules/`. Running `aspire restore` regenerates these SDKs—useful after upgrading or switching branches (this also runs automatically on `aspire run`).
+When you run `aspire add`, the CLI inspects the integration's .NET assembly and generates a TypeScript SDK into `.aspire/modules/`. Running `aspire restore` regenerates these SDKs—useful after upgrading or switching branches (this also runs automatically on `aspire run`).
In 13.2, the code generator gained AspireList support for richer collection handling and now covers Go, Java, and Rust test targets alongside TypeScript.
@@ -594,8 +594,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -647,8 +647,8 @@ builder.AddContainer("worker", "contoso/worker")
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -821,8 +821,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -864,8 +864,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1021,8 +1021,8 @@ api.WithReference(dataLake)
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1085,8 +1085,8 @@ builder.Build().Run();
-```typescript title="TypeScript — apphost.ts" twoslash
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts" twoslash
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1292,7 +1292,7 @@ Aspire 13.2.1 is a patch release focused on reliability fixes.
### Breaking changes in the TypeScript AppHost SDK
-The following TypeScript AppHost APIs were renamed. Update any affected `apphost.ts` files accordingly:
+The following TypeScript AppHost APIs were renamed. Update any affected `apphost.mts` files accordingly:
| Previous name | New name | Notes |
| --- | --- | --- |
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
index 5ab930c59..74ceb4594 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-3.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 13.3
-description: Aspire 13.3 brings the new aspire destroy command, browser console log and screenshot capture in the dashboard, end-to-end Helm-based Kubernetes deployment via aspire deploy, JavaScript publishing for Next.js/Vite/SSR frameworks, the container tunnel enabled by default, deeper TypeScript AppHost parity, and a refreshed Azure integration suite.
+title: "What's new in Aspire 13.3"
+description: "Explore Aspire 13.3: aspire destroy, Helm-based Kubernetes deploy, browser screenshot capture, JavaScript publishing, default container tunnel, and Azure updates."
sidebar:
label: Aspire 13.3
order: 0
@@ -345,10 +345,10 @@ builder.AddProject("api")
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -396,10 +396,10 @@ ingress.WithRoute("/", api.GetEndpoint("http"));
```
-
+
```typescript title="TypeScript — Ingress with cert-manager"
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -445,10 +445,10 @@ builder.AddContainer("netshoot", "nicolaka/netshoot")
```
-
+
```typescript title="TypeScript — Privileged Docker Compose service"
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -495,10 +495,10 @@ builder.AddProject("api")
```
-
+
```typescript title="TypeScript — HTTP command with result body"
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -546,7 +546,7 @@ builder.AddProject("myservice")
```
-
+
```typescript title="TypeScript — Issue an access token from a resource command"
import {
@@ -554,7 +554,7 @@ import {
CommandResultFormat,
type ExecuteCommandContext,
type ExecuteCommandResult,
-} from './.modules/aspire.js';
+} from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -609,10 +609,10 @@ builder.SubscribeAfterResourcesCreated(async e => { /* ... */ });
```
-
+
```typescript title="TypeScript — Subscribe to lifecycle events"
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -653,10 +653,10 @@ builder.AddProject("api")
```
-
+
```typescript title="TypeScript — Exclude an endpoint from withReference"
-import { createBuilder } from './.modules/aspire.js';
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -696,7 +696,7 @@ Aspire 13.3 closes most of the remaining functional gap between C# AppHosts and
Aspire 13.3 introduces a unified `withEnvironment(name, value)` API for polyglot AppHosts (TypeScript, Java, Python, Go, Rust). Previously, environment variable injection required separate methods for each value kind (`withEnvironmentEndpoint`, `withEnvironmentParameter`, `withEnvironmentConnectionString`, and so on). Now, a single call handles all value types:
-```typescript title="TypeScript — apphost.ts"
+```typescript title="TypeScript — apphost.mts"
const api = await builder.addProject('api', '../Api/Api.csproj');
await api
.withEnvironment('SERVICE_URL', cache.primaryEndpoint)
@@ -746,10 +746,10 @@ builder.Build().Run();
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -783,10 +783,10 @@ builder.Build().Run();
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -821,10 +821,10 @@ builder.Build().Run();
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -930,10 +930,10 @@ builder.AddViteApp("frontend")
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1013,10 +1013,10 @@ builder.AddAzureFrontDoor("frontdoor")
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1074,11 +1074,11 @@ var keyVault = builder.AddAzureKeyVault("kv")
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
-import { NetworkSecurityPerimeterAccessRuleDirection } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+import { NetworkSecurityPerimeterAccessRuleDirection } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
@@ -1133,10 +1133,10 @@ builder.AddProject("api")
```
-
+
-```typescript title="TypeScript — apphost.ts"
-import { createBuilder } from './.modules/aspire.js';
+```typescript title="TypeScript — apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx b/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx
new file mode 100644
index 000000000..0cb20251e
--- /dev/null
+++ b/src/frontend/src/content/docs/whats-new/aspire-13-4.mdx
@@ -0,0 +1,412 @@
+---
+title: "What's new in Aspire 13.4"
+description: "Explore Aspire 13.4: GA TypeScript AppHost, richer Kubernetes and AKS deployment APIs, process resource commands, CLI integration discovery, and dashboard updates."
+sidebar:
+ label: Aspire 13.4
+ order: 0
+tableOfContents:
+ minHeadingLevel: 2
+ maxHeadingLevel: 2
+---
+
+import {
+ Steps,
+ Aside,
+ Icon,
+ Tabs,
+ TabItem,
+} from '@astrojs/starlight/components';
+import LearnMore from '@components/LearnMore.astro';
+import OsAwareTabs from '@components/OsAwareTabs.astro';
+
+Aspire 13.4 is here, with a release focused on broadening the app model and smoothing day-to-day operations — led by **TypeScript AppHost support reaching general availability**, a new set of **TypeScript samples**, **TypeScript documentation parity with C#**, expanded **Kubernetes and AKS deployment APIs**, **process-backed resource commands**, **integration discovery** from the CLI, server-side **log and telemetry search**, a dashboard **AI Agents** entry point, and a more capable Aspire extension for Visual Studio Code.
+
+We'd love to hear what you think. Drop by [ Discord](https://aka.ms/aspire-discord) to chat with the team and the community, or file feedback and issues on [ GitHub](https://github.com/microsoft/aspire/issues).
+
+This release introduces:
+
+- **TypeScript AppHost general availability** with stronger startup validation, more complete TypeScript SDK generation, new TypeScript samples, and documentation parity with C# AppHost examples.
+- **Kubernetes and AKS deployment improvements** including [cert-manager integration, Gateway API and Azure Application Gateway for Containers (AGC) support](/deployment/kubernetes/aks/#expose-your-app-to-the-internet), Kubernetes manifest resources, external Helm charts, and consolidated Helm chart configuration.
+- **Richer resource commands** with typed arguments, visibility controls, immediate result display, named CLI options, resource-scoped help, and the experimental `WithProcessCommand` API.
+- **CLI discoverability and diagnostics** with `aspire integration list`, `aspire integration search`, `--search` for logs and telemetry, version checks in `aspire doctor`, better logs output, and more consistent command error handling.
+- **Dashboard and editor updates** including the AI Agents dialog, resource state fixes, CodeLens actions that appear without opening the Aspire panel, and improved VS Code terminal/debug output integration.
+- **Integration updates** for NATS, Azure Front Door, Foundry hosted agents, and more.
+- …and much more.
+
+## 🆙 Upgrade to Aspire 13.4
+
+
+
+
+
+
+
+
+
+
+For general purpose upgrade guidance, see [Upgrade Aspire](/whats-new/upgrade-aspire/).
+
+The easiest way to upgrade to Aspire 13.4 is using the [`aspire update` command](/reference/cli/commands/aspire-update/):
+
+
+
+1. Update the Aspire CLI itself:
+
+ ```bash title="Aspire CLI — Update the CLI"
+ aspire update --self
+ ```
+
+1. Update your projects (run from the root of your repository):
+
+ ```bash title="Aspire CLI — Update all Aspire packages"
+ aspire update
+ ```
+
+
+
+Or install the CLI from scratch:
+
+
+
+
+ ```bash title="Aspire CLI — Install Aspire CLI"
+ curl -sSL https://aspire.dev/install.sh | bash
+ ```
+
+
+
+
+ ```powershell title="Aspire CLI — Install Aspire CLI"
+ irm https://aspire.dev/install.ps1 | iex
+ ```
+
+
+
+
+
+ For more details on installing the Aspire CLI, see [Install the
+ CLI](/get-started/install-cli/).
+
+
+## 🌐 TypeScript AppHost general availability
+
+TypeScript AppHost support is now generally available. You can author Aspire app models in `apphost.mts` as a first-class AppHost experience, with the same code-first orchestration model used by C# AppHosts and a generated TypeScript SDK for Aspire resources and integrations.
+
+Aspire 13.4 strengthens the TypeScript experience by validating TypeScript AppHosts before startup, so type-checking and compile errors fail early instead of surfacing after the application starts. New TypeScript AppHosts use the explicit ES module entry point `apphost.mts`, generated SDK modules are consolidated under `.aspire/modules/`, and `aspire init --language typescript` creates a nested `aspire-apphost/` package when run in an existing JavaScript or TypeScript app. The generated TypeScript SDK also includes fixes for name collisions, inherited resource type exports, Docker service config/secret/ulimit reference exports, exact-target export shadowing across integrations, and builder and callback generation.
+
+The documentation now treats TypeScript AppHosts as a first-class peer to C# AppHosts: AppHost-focused guides and integration pages include TypeScript examples alongside C# where the API is available. The release also adds a new set of TypeScript samples so you can start from working `apphost.mts` projects instead of translating from C#.
+
+Existing TypeScript AppHosts scaffolded by earlier CLI versions (using `apphost.ts` and `./.modules/aspire.js`) continue to work on 13.4 without changes — the CLI transparently routes generated SDK files to the legacy `./.modules/` folder and rewrites them to `.ts`/`.js` so existing imports resolve. See [Legacy `apphost.ts` projects (pre-13.4)](/app-host/typescript-apphost/#legacy-apphostts-projects-pre-134) for details and an opt-in migration to the new `apphost.mts` layout.
+
+
+ For setup details, see [TypeScript AppHosts](/app-host/typescript-apphost/).
+ To explore working examples, browse the [Aspire samples](/reference/samples/).
+
+
+## 🛠️ CLI enhancements
+
+### Discover integrations from the CLI
+
+The new `aspire integration` command group helps you find available Aspire hosting integrations without modifying an AppHost project. Use `aspire integration list` to browse all integrations or `aspire integration search` to search by keyword.
+
+```bash title="Aspire CLI — Search integrations"
+aspire integration list
+aspire integration search redis
+```
+
+After you find the integration you need, use [`aspire add`](/reference/cli/commands/aspire-add/) to add it to your AppHost.
+
+### Search logs and telemetry
+
+`aspire logs` and the `aspire otel` commands now support `--search`, so you can filter logs and telemetry by keyword directly from the CLI. For console logs, Aspire searches the log message text and resource prefix. For structured logs, Aspire searches the message, attributes, scope name, event name, trace and span IDs, severity, and resource name. For spans and traces, Aspire searches span names, trace and span IDs, attributes, status, kind, scope, events, resource names, and trace names. Search, tail, and resource filters are applied before data is streamed back to the CLI, which keeps large log streams responsive.
+
+```bash title="Aspire CLI — Search logs"
+aspire logs --search "failed"
+aspire otel logs --search "checkout"
+aspire otel traces --search "POST /orders"
+```
+
+
+ See [`aspire logs`](/reference/cli/commands/aspire-logs/) and [`aspire otel
+ logs`](/reference/cli/commands/aspire-otel-logs/) for telemetry CLI usage.
+
+
+### Better environment diagnostics
+
+[`aspire doctor`](/reference/cli/commands/aspire-doctor/) now reports the current Aspire CLI version, shows an update notice when a newer version is available, and reports the AppHost SDK version when an AppHost is detected. This makes CLI/SDK version mismatches easier to spot before they become restore or runtime issues.
+
+### Resource command CLI improvements
+
+Resource command inputs are now passed as named CLI options instead of positional arguments. This makes optional inputs easier to skip and lets users supply values in any order. Running `aspire resource --help` also shows the commands available for that specific resource.
+
+```bash title="Aspire CLI — Resource command arguments"
+aspire resource cache seed-data --dataset small --force true
+aspire resource cache --help
+```
+
+
+ For more information, see [`aspire
+ resource`](/reference/cli/commands/aspire-resource/).
+
+
+### CLI quality-of-life
+
+Aspire 13.4 includes a set of smaller CLI improvements and fixes:
+
+- CLI commands now use centralized error and cancellation handling, so cancellation and help output are quieter and more consistent.
+- `aspire logs` dims timestamps for readability and shows `No logs found.` when there are no entries, while preserving JSON output for automation.
+- Log file paths in CLI output are clickable terminal links when the terminal supports hyperlinks and degrade gracefully to plain text otherwise.
+- Package-manager installs such as WinGet, Homebrew, and `dotnet tool` keep the CLI bundle beside the CLI binary, so uninstall and upgrade flows clean up the bundle correctly.
+- `aspire update` now requires `--yes` in non-interactive mode, matching `aspire destroy`.
+- `aspire stop --all` output includes the AppHost name and, when needed, the PID for clearer multi-instance shutdown output.
+- `aspire new`, `aspire init`, `aspire run`, and `aspire update` include fixes for NuGet feed errors, output paths, generated files, disabled dashboards, detached shutdown, and AppHost package-reference cleanup.
+
+## 🧩 App model and AppHost
+
+### Resource command arguments, visibility, and results
+
+Custom resource commands can now declare typed input arguments with labels, descriptions, default values, required-state metadata, allowed values, and custom validation. Commands can also control where they appear with `ResourceCommandVisibility`, so you can expose a command to the dashboard UI, automation APIs and MCP tools, both, or neither.
+
+Command results can be configured to display immediately in the dashboard, making interactive commands easier to use when they return structured output or captured text.
+
+
+ For the full API surface, see [Custom resource
+ commands](/fundamentals/custom-resource-commands/).
+
+
+### Process-backed resource commands
+
+Aspire 13.4 adds the experimental `WithProcessCommand` API for exposing local tools, scripts, and CLIs as resource commands. The helper starts a process on the AppHost machine, passes arguments without going through a shell, streams stdout and stderr to the command logger, captures bounded output, and maps process exit codes to resource command results.
+
+
+
+
+
+
+```csharp title="AppHost.cs"
+#pragma warning disable ASPIREPROCESSCOMMAND001
+
+var builder = DistributedApplication.CreateBuilder(args);
+
+builder.AddRedis("cache")
+ .WithProcessCommand(
+ name: "dotnet-version",
+ displayName: "Show .NET version",
+ executablePath: "dotnet",
+ arguments: ["--version"]);
+
+builder.Build().Run();
+```
+
+
+
+
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const cache = await builder.addRedis('cache');
+
+await cache.withProcessCommand('node-version', 'Show Node.js version', {
+ executablePath: 'node',
+ arguments: ['--version'],
+});
+
+await builder.build().run();
+```
+
+
+
+
+
+ For static commands, dynamic process specs, stdin, environment variables, and
+ result options, see [Process-backed resource
+ commands](/fundamentals/custom-resource-commands/#process-backed-resource-commands).
+
+
+### AppHost and runtime reliability
+
+Aspire 13.4 also improves the AppHost runtime:
+
+- The active container runtime (Docker or Podman) is propagated to project image builds through `PublishContainer`, keeping project builds aligned with the runtime used for container resources.
+- YARP endpoint resolution is deferred until environment configuration generation, so late endpoint scheme changes are reflected in generated proxy configuration.
+- Container resources can no longer use the reserved name `aspire`, which avoids conflicts with the container tunnel.
+- Container tunnel errors include more diagnostic detail, and a startup deadlock for tunnel-dependent containers has been fixed.
+- Foundry hosted agents validate environment variable names up front, avoiding deploy-time failures caused by unsupported characters.
+- `AzureRoleAssignmentResource` is now public so deployment pipeline code can inspect Azure role assignments.
+
+### Aspire CLI bundle opt-in for C# AppHosts
+
+C# AppHost projects can opt in to using the installed Aspire CLI bundle as the source for DCP and Dashboard orchestration dependencies by setting `true`. This is a preview transition path for the upcoming shift where AppHost orchestration dependencies come from the CLI bundle by default, instead of being restored from platform-specific NuGet packages per AppHost project.
+
+
+ For setup details, see [Use the Aspire CLI bundle for orchestration
+ dependencies](/get-started/aspire-sdk/#use-the-aspire-cli-bundle-for-orchestration-dependencies)
+ in the Aspire SDK documentation.
+
+
+## 🚢 Kubernetes, AKS, and Azure deployment
+
+### Cert-manager, Gateway API, and AGC support
+
+Kubernetes and AKS deployment continue to expand in 13.4. Kubernetes environments can now model cert-manager resources through typed APIs, including cert-manager installation, ClusterIssuers backed by Let's Encrypt or custom ACME servers, and TLS wiring for gateways.
+
+For AKS, `AddAzureKubernetesEnvironment` now wires Azure Application Gateway for Containers (AGC) into the deployment flow. When `AddLoadBalancer(...)` is used, Aspire provisions the AGC ingress profile on AKS, assigns the required Network Contributor role to the controller identity, and exposes Gateway API routing for the application.
+
+
+ For a complete walkthrough including custom domains, see [Deploy to AKS — Expose your app to the internet](/deployment/kubernetes/aks/#expose-your-app-to-the-internet).
+
+
+### Kubernetes manifests and external Helm charts
+
+Aspire 13.4 adds a Kubernetes manifest resource API for arbitrary manifests and an `AddHelmChart` API for installing external Helm charts as deployment pipeline steps. These APIs make it possible to include Kubernetes-native resources, ingress controllers, monitoring stacks, and other third-party charts alongside the resources generated from your Aspire application model.
+
+### Ingress `WithRoute` renamed to `WithPath`
+
+The Kubernetes `Ingress` routing API has been renamed from `WithRoute(...)` to `WithPath(...)` to better reflect the Kubernetes Ingress path-rule terminology and to disambiguate it from the Gateway API. Update existing AppHosts that call `ingress.WithRoute(...)` to call `ingress.WithPath(...)` instead. The Gateway API equivalent (`gateway.WithRoute(...)`) is unchanged.
+
+### Consolidated Helm chart configuration
+
+Helm chart name, version, description, release name, and namespace are now configured through the `WithHelm(...)` extension method. This replaces the previous parallel property-based configuration surface on `KubernetesEnvironmentResource` with one fluent entry point.
+
+
+ For examples of `WithHelm(...)`, see the [Kubernetes
+ integration](/integrations/compute/kubernetes/#configure-helm-chart-options).
+
+
+## 📊 Dashboard improvements
+
+### AI Agents dialog
+
+The dashboard header now includes an **AI Agents** dialog with guidance for connecting AI coding agents to your Aspire app. This builds on the Aspire CLI and MCP server workflow where agents can query resource status, structured logs, console logs, traces, and other dashboard data while they work in your codebase.
+
+Administrators can hide the header button with the `Dashboard:UI:DisableAgentHelp` setting.
+
+
+ For the agent workflow, see [Dashboard and AI coding
+ agents](/dashboard/ai-coding-agents/). For the dashboard setting, see
+ [Dashboard configuration](/dashboard/configuration/).
+
+
+### Dashboard fixes
+
+Dashboard fixes in this release include:
+
+- `!=` and `not contains` filters on the Traces page now return the expected results.
+- Static web assets are served correctly when running the dashboard from source outside the `Development` environment.
+- The resource details panel now displays an `Unknown` state consistently when a resource has no state.
+- Containers in `FailedToStart` state now show a more accurate state detail instead of suggesting the container previously ran.
+
+## 🧰 VS Code extension
+
+The Aspire extension for Visual Studio Code now shows AppHost CodeLens actions directly in the editor without requiring the Aspire panel to be open. In addition to **Run**, **Stop**, and **Restart**, new **Open Dashboard** and **View Logs** CodeLens actions make common AppHost operations available where you're editing code.
+
+The extension also uses VS Code terminal shell integration when sending Aspire CLI commands to the Aspire terminal, forwards debug adapter output to dashboard logs, shows AppHost errors in the debug console, reduces TypeScript and C# AppHost debug-console noise, disables automatic `dotnet restore` on startup by default, and fixes a sticky **Finding apphosts** notification.
+
+
+ Learn more about the [Aspire Visual Studio Code
+ extension](/get-started/aspire-vscode-extension/).
+
+
+## 📦 Integration updates
+
+### Azure Front Door naming
+
+Azure Front Door CDN resources now use Azure.Provisioning's built-in name-generation algorithm instead of Aspire's custom logic. This removes Aspire's manual name-length cap and aligns generated resource names with Azure.Provisioning behavior.
+
+
+
+
+ For Front Door setup, see the [Azure Front Door
+ integration](/integrations/cloud/azure/azure-front-door/).
+
+
+### NATS client updates
+
+`AddNatsClient` now also registers `INatsClient` and defaults the serializer registry to `NatsClientDefaultSerializerRegistry`. This enables typed publish/subscribe scenarios without requiring explicit serializer configuration. User-provided serializer registries still take precedence, and primitive/raw byte scenarios are unaffected.
+
+
+ For client setup, see [Connect to
+ NATS](/integrations/messaging/nats/nats-connect/).
+
+
+### Foundry fixes
+
+Azure AI Foundry hosted agents also include deployment fixes: project endpoints now use the correct `customSubDomainName` format, the Foundry-created agent identity receives the Cognitive Services User role automatically, and the app identity is no longer incorrectly injected into the hosted-agent environment.
+
+## 🐛 Bug fixes and full changelog
+
+For the complete list of bug fixes and smaller changes in this release, see the [Aspire 13.4 release notes on GitHub](https://github.com/microsoft/aspire/releases/tag/v13.4.0).
+
+## 🙏 Community contributions
+
+Aspire is built in the open, and this release wouldn't be what it is without you. A huge thank you to all community contributors who helped make Aspire 13.4 possible — including [@mtmk](https://github.com/mtmk) for the NATS client update, [@ellahathaway](https://github.com/ellahathaway) for friendlier `aspire new` NuGet feed errors, [@Bertolossi](https://github.com/Bertolossi) for fixing an `aspire run` watch-mode hang, and [@arpitjain099](https://github.com/arpitjain099) for CI permission hardening. We're always excited to [see community contributions](/community/contributors/)! If you'd like to get involved, check out our [contributing guide](/community/contributor-guide/).
+
+## ⚠️ Breaking changes
+
+
+
+| Change | Migration |
+| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| The experimental `aspire exec` command was removed. | Remove scripts or workflows that call `aspire exec`. For resource-specific actions, use [`aspire resource`](/reference/cli/commands/aspire-resource/) when the resource exposes a command. |
+| Kubernetes Helm chart settings moved to `WithHelm(...)`. | Replace property-based configuration on `KubernetesEnvironmentResource` with the `WithHelm(...)` fluent builder. |
+| Azure Front Door CDN resources use Azure.Provisioning name generation. | If an upgrade produces duplicate endpoint, origin group, or route names, remove and re-add the affected resource or set `Name` explicitly with `ConfigureInfrastructure`. |
+
+### Behavior changes to audit
+
+- `aspire update` now requires `--yes` in non-interactive mode.
+- Resource command arguments are named options in the CLI instead of positional values.
+- TypeScript AppHosts are validated before startup, so invalid TypeScript fails earlier.
+
+### Migration from Aspire 13.3 to 13.4
+
+
+
+1. **Update the CLI** — run `aspire update --self`. This step is **required** for TypeScript AppHosts; running `aspire update` against a 13.3.x TypeScript project before updating the CLI fails with `No code generator found for language: TypeScript` and leaves the project in a partially-upgraded, unrunnable state (see [microsoft/aspire#17077](https://github.com/microsoft/aspire/issues/17077)).
+2. **Update your projects** — run `aspire update` from the root of your repository.
+3. **Run `aspire doctor`** to check your environment setup.
+4. **Audit scripts and CI** for `aspire exec` and non-interactive `aspire update` calls.
+5. **Update Kubernetes Helm configuration** to use `WithHelm(...)` if your AppHost set Helm chart properties directly.
+6. **Review Azure Front Door deployments** and set explicit names if existing resources conflict with Azure.Provisioning name generation.
+
+
+
+**Build something amazing.** We'd love to hear about your experience with Aspire 13.4 — share what you're building on [GitHub](https://github.com/microsoft/aspire/issues) or come hang out with us on [Discord](https://aka.ms/aspire-discord).
diff --git a/src/frontend/src/content/docs/whats-new/aspire-13.mdx b/src/frontend/src/content/docs/whats-new/aspire-13.mdx
index 7544618d6..f813f603a 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-13.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-13.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 13
-description: Aspire 13.0 introduces multi-language application development with first-class Python and JavaScript support, container-based builds, aspire do pipelines, VS Code extension, and modern CLI tooling updates and improvements.
+title: "What's new in Aspire 13"
+description: "Explore Aspire 13.0: multi-language app development with first-class Python and JavaScript support, container-based builds, aspire do pipelines, and VS Code extension."
sidebar:
label: Aspire 13.0
order: 2
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9-1.mdx b/src/frontend/src/content/docs/whats-new/aspire-9-1.mdx
index 59256a802..3434fe130 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9-1.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9-1.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire 9.1
-description: Learn what's new in Aspire 9.1.
+title: "What's new in Aspire 9.1"
+description: "Explore Aspire 9.1: parent and child resource grouping, dashboard language picker, telemetry filtering, console log downloads, and resource detail enhancements."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2025-02-25
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9-2.mdx b/src/frontend/src/content/docs/whats-new/aspire-9-2.mdx
index f4ebc3ad7..6c99bfb9e 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9-2.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9-2.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire 9.2
-description: Learn what's new in the official general availability release of Aspire 9.2.
+title: "What's new in Aspire 9.2"
+description: "Explore Aspire 9.2: dashboard cardinality limits, UTC console logs, telemetry pause, resource icons, and broader app-host and integrations updates across the stack."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2025-04-10
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9-3.mdx b/src/frontend/src/content/docs/whats-new/aspire-9-3.mdx
index bb4f42685..42578b971 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9-3.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9-3.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 9.3
-description: Learn what's new in the official general availability release of Aspire 9.3.
+title: "What's new in Aspire 9.3"
+description: "Explore Aspire 9.3: GitHub Copilot in the dashboard, dashboard context menu, metric warnings, traces for uninstrumented resources, and dashboard filtering updates."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2025-05-19
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9-4.mdx b/src/frontend/src/content/docs/whats-new/aspire-9-4.mdx
index 2e7633268..f508370b3 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9-4.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9-4.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 9.4
-description: Learn what's new in the official general availability release of Aspire 9.4.
+title: "What's new in Aspire 9.4"
+description: "Explore Aspire 9.4: dashboard interaction service, hidden resources, connection-string display, tracing peers, console log wrapping, and parameter authoring updates."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2025-07-29
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9-5.mdx b/src/frontend/src/content/docs/whats-new/aspire-9-5.mdx
index 684ad2aa1..f2d3200ec 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9-5.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9-5.mdx
@@ -1,6 +1,6 @@
---
-title: What's new in Aspire 9.5
-description: Learn what's new in Aspire 9.5.
+title: "What's new in Aspire 9.5"
+description: "Explore Aspire 9.5: combined console logs view, GenAI trace visualizer, trace details, aspire update, richer property grids, and a refreshed dashboard."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2025-09-25
diff --git a/src/frontend/src/content/docs/whats-new/aspire-9.mdx b/src/frontend/src/content/docs/whats-new/aspire-9.mdx
index 5eff71a40..bf6115ed7 100644
--- a/src/frontend/src/content/docs/whats-new/aspire-9.mdx
+++ b/src/frontend/src/content/docs/whats-new/aspire-9.mdx
@@ -1,6 +1,6 @@
---
-title: Aspire 9.0
-description: Learn what's new in Aspire 9.0.
+title: "What's new in Aspire 9.0"
+description: "Explore Aspire 9.0: ANSI console log formatting, browser telemetry, waiting-for-resource health gates, persistent containers, Redis Insight, and Azure Functions support."
tableOfContents:
maxHeadingLevel: 2
publishDate: 2024-11-12
diff --git a/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx b/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx
index ee09ffefa..0d9b8b647 100644
--- a/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx
+++ b/src/frontend/src/content/docs/whats-new/upgrade-aspire.mdx
@@ -1,6 +1,6 @@
---
-title: Upgrade Aspire
-description: Learn how to upgrade an Aspire app to the latest version.
+title: Upgrade Aspire to the latest version
+description: "Learn how to upgrade an existing Aspire app: update the Aspire CLI, run aspire update, refresh NuGet packages, and review breaking changes for each release."
---
import { Aside, Steps } from '@astrojs/starlight/components';
diff --git a/src/frontend/src/content/docs/zh-cn/index.mdx b/src/frontend/src/content/docs/zh-cn/index.mdx
index c25a097c8..224834e46 100644
--- a/src/frontend/src/content/docs/zh-cn/index.mdx
+++ b/src/frontend/src/content/docs/zh-cn/index.mdx
@@ -11,7 +11,7 @@ prev: false
next: false
banner:
content: |
- 🚀 Aspire 13.3 已发布! — 查看 Aspire 13.3 的新功能。
+ 🚀 Aspire 13.4 已发布! — 查看 Aspire 13.4 的新功能。
hero:
tagline: 精简你的技术栈。
轻松编排前端、API、容器和数据库—无需重写,无限可能。扩展 Aspire 为任何项目赋能。
image:
diff --git a/src/frontend/src/data/aspire-integration-names.json b/src/frontend/src/data/aspire-integration-names.json
index e03ac7b0f..bf9bd30e5 100644
--- a/src/frontend/src/data/aspire-integration-names.json
+++ b/src/frontend/src/data/aspire-integration-names.json
@@ -40,6 +40,7 @@
"Aspire.Hosting.Elasticsearch",
"Aspire.Hosting.Garnet",
"Aspire.Hosting.GitHub.Models",
+ "Aspire.Hosting.Go",
"Aspire.Hosting.JavaScript",
"Aspire.Hosting.Kafka",
"Aspire.Hosting.Keycloak",
diff --git a/src/frontend/src/data/integration-docs.json b/src/frontend/src/data/integration-docs.json
index d9c9a0a2a..804b5311f 100644
--- a/src/frontend/src/data/integration-docs.json
+++ b/src/frontend/src/data/integration-docs.json
@@ -179,6 +179,10 @@
"match": "Aspire.Hosting.GitHub.Models",
"href": "/integrations/ai/github-models/github-models-get-started/"
},
+ {
+ "match": "Aspire.Hosting.Go",
+ "href": "/integrations/frameworks/go/go-get-started/"
+ },
{
"match": "Aspire.Hosting.JavaScript",
"href": "/integrations/frameworks/javascript/"
@@ -403,10 +407,6 @@
"match": "CommunityToolkit.Aspire.Hosting.GoFeatureFlag",
"href": "/integrations/devtools/goff/goff-get-started/"
},
- {
- "match": "CommunityToolkit.Aspire.Hosting.Golang",
- "href": "/integrations/frameworks/go-apps/"
- },
{
"match": "CommunityToolkit.Aspire.Hosting.Java",
"href": "/integrations/frameworks/java/"
diff --git a/src/frontend/src/data/ts-modules/Aspire.Hosting.13.3.0.json b/src/frontend/src/data/ts-modules/Aspire.Hosting.13.3.0.json
index 5a1728840..af891b6b0 100644
--- a/src/frontend/src/data/ts-modules/Aspire.Hosting.13.3.0.json
+++ b/src/frontend/src/data/ts-modules/Aspire.Hosting.13.3.0.json
@@ -35,17 +35,20 @@
"name": "addContainer",
"capabilityId": "Aspire.Hosting/addContainer",
"qualifiedName": "addContainer",
- "description": "Adds a container resource",
+ "description": "Adds a container resource to the application.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "addContainer(name: string, image: AddContainerOptions): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "image",
- "type": "AddContainerOptions"
+ "type": "AddContainerOptions",
+ "description": "The image name or image options for the container."
}
],
"returnType": "ContainerResource",
@@ -169,27 +172,33 @@
"name": "addDockerfile",
"capabilityId": "Aspire.Hosting/addDockerfile",
"qualifiedName": "addDockerfile",
- "description": "Adds a container resource built from a Dockerfile",
+ "description": "Adds a Dockerfile to the application model that can be treated like a container resource.",
+ "remarks": "The `contextPath` is relative to the AppHost directory unless it is a fully qualified path.\nThe `dockerfilePath` is relative to the `contextPath` unless it is a fully qualified path.\nIf the `dockerfilePath` is not provided, it defaults to \"Dockerfile\" in the `contextPath`.\nWhen generating the manifest for deployment tools, the `AddDockerfile`\nmethod results in an additional attribute being added to the `container.v1` resource type which contains the configuration\nnecessary to allow the deployment tool to build the container image prior to deployment.\nCreates a container called `mycontainer` based on a Dockerfile in the context path `path/to/context`.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddDockerfile(\"mycontainer\", \"path/to/context\");\nbuilder.Build().Run();\n```",
+ "returns": "A `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "dockerfilePath",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Path to the Dockerfile relative to the `contextPath`. Defaults to \"Dockerfile\" if not specified."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -203,28 +212,34 @@
"name": "addDockerfileBuilder",
"capabilityId": "Aspire.Hosting/addDockerfileBuilder",
"qualifiedName": "addDockerfileBuilder",
- "description": "Adds a container resource built from a programmatically generated Dockerfile",
+ "description": "Adds a Dockerfile to the application model that can be treated like a container resource, with the Dockerfile generated programmatically using the `DockerfileBuilder` API.",
+ "remarks": "This method provides a programmatic way to build Dockerfiles using the `DockerfileBuilder` API\ninstead of string manipulation.\nThe `contextPath` is relative to the AppHost directory unless it is fully qualified.\nCreates a container with a programmatically built Dockerfile:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddDockerfileBuilder(\"mycontainer\", \"path/to/context\", context =>\n{\ncontext.Builder.From(\"alpine:latest\")\n.WorkDir(\"/app\")\n.Copy(\".\", \".\")\n.Cmd([\"./myapp\"]);\nreturn Task.CompletedTask;\n});\nbuilder.Build().Run();\n```",
+ "returns": "A `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "addDockerfileBuilder(name: string, contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E, stage?: string): ContainerResource",
+ "signature": "addDockerfileBuilder(name: string, contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) => Promise, stage?: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: DockerfileBuilderCallbackContext) => Promise",
+ "description": "A callback that uses the `DockerfileBuilder` API to construct the Dockerfile."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -238,17 +253,20 @@
"name": "addDotnetTool",
"capabilityId": "Aspire.Hosting/addDotnetTool",
"qualifiedName": "addDotnetTool",
- "description": "Adds a .NET tool resource",
+ "description": "Adds a .NET tool resource to the application model.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addDotnetTool(name: string, packageId: string): DotnetToolResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "packageId",
- "type": "string"
+ "type": "string",
+ "description": "The package id of the tool."
}
],
"returnType": "DotnetToolResource",
@@ -262,15 +280,16 @@
"name": "addEventingSubscriber",
"capabilityId": "Aspire.Hosting/addEventingSubscriber",
"qualifiedName": "addEventingSubscriber",
- "description": "Adds an eventing subscriber",
+ "description": "Adds an ATS-friendly eventing subscriber callback to the distributed-application builder.",
"kind": "Method",
- "signature": "addEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "addEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) => Promise): void",
"parameters": [
{
"name": "subscribe",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EventingSubscriberRegistrationContext) => Promise",
+ "description": "The callback that registers the event subscriptions."
}
],
"returnType": "void",
@@ -283,25 +302,31 @@
"name": "addExecutable",
"capabilityId": "Aspire.Hosting/addExecutable",
"qualifiedName": "addExecutable",
- "description": "Adds an executable resource",
+ "description": "Adds an executable resource to the application model.",
+ "remarks": "You can run any executable command using its full path.\nAs a security feature, Aspire doesn't run executable unless the command is located in a path listed in the PATH environment variable.\nTo run an executable file that's in the current directory, specify the full path or use the relative path `./` to represent the current directory.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addExecutable(name: string, command: string, workingDirectory: string, args: string[]): ExecutableResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "The executable path. This can be a fully qualified path or a executable to run from the shell/command line."
},
{
"name": "workingDirectory",
- "type": "string"
+ "type": "string",
+ "description": "The working directory of the executable."
},
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to the executable."
}
],
"returnType": "ExecutableResource",
@@ -339,17 +364,19 @@
"name": "addMarkdown",
"capabilityId": "Aspire.Hosting/addMarkdown",
"qualifiedName": "addMarkdown",
- "description": "Adds a Markdown-formatted value to the pipeline summary",
+ "description": "Adds a key-value pair to the pipeline summary with a Markdown-formatted value.",
"kind": "Method",
"signature": "addMarkdown(key: string, markdownString: string): void",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key or label for the item."
},
{
"name": "markdownString",
- "type": "string"
+ "type": "string",
+ "description": "The Markdown-formatted value for the item."
}
],
"returnType": "void",
@@ -399,23 +426,27 @@
"name": "addParameterFromConfiguration",
"capabilityId": "Aspire.Hosting/addParameterFromConfiguration",
"qualifiedName": "addParameterFromConfiguration",
- "description": "Adds a parameter sourced from configuration",
+ "description": "Adds a parameter resource to the application, with a value coming from configuration.",
+ "returns": "Resource builder for the parameter.",
"kind": "Method",
"signature": "addParameterFromConfiguration(name: string, configurationKey: string, secret?: boolean): ParameterResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "Name of parameter resource"
},
{
"name": "configurationKey",
- "type": "string"
+ "type": "string",
+ "description": "Configuration key used to get the value of the parameter"
},
{
"name": "secret",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "Optional flag indicating whether the parameter should be regarded as secret."
}
],
"returnType": "ParameterResource",
@@ -494,29 +525,33 @@
"name": "addStep",
"capabilityId": "Aspire.Hosting/addStep",
"qualifiedName": "addStep",
- "description": "Adds a pipeline step to the application",
+ "description": "Adds an application-level pipeline step in a TypeScript-friendly shape.",
"kind": "Method",
- "signature": "addStep(stepName: string, callback: (arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E, dependsOn?: string[], requiredBy?: string[]): void",
+ "signature": "addStep(stepName: string, callback: (arg: PipelineStepContext) => Promise, dependsOn?: string[], requiredBy?: string[]): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The unique name of the pipeline step."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineStepContext) => Promise",
+ "description": "The callback to execute when the step runs."
},
{
"name": "dependsOn",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that this step depends on."
},
{
"name": "requiredBy",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that require this step."
}
],
"returnType": "void",
@@ -529,7 +564,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.model",
"qualifiedName": "AfterResourcesCreatedEvent.model",
- "description": "Gets the Model property",
+ "description": "The `DistributedApplicationModel` instance.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -543,7 +578,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.services",
"qualifiedName": "AfterResourcesCreatedEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` instance.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -605,7 +640,8 @@
"name": "asHttp2Service",
"capabilityId": "Aspire.Hosting/asHttp2Service",
"qualifiedName": "asHttp2Service",
- "description": "Configures resource for HTTP/2",
+ "description": "Configures a resource to mark all endpoints' transport as HTTP/2. This is useful for HTTP/2 services that need prior knowledge.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "asHttp2Service(): IResourceWithEndpoints",
"parameters": [],
@@ -652,7 +688,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.ApplicationModel/BeforeStartEvent.model",
"qualifiedName": "BeforeStartEvent.model",
- "description": "Gets the Model property",
+ "description": "The `DistributedApplicationModel` instance.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -666,7 +702,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/BeforeStartEvent.services",
"qualifiedName": "BeforeStartEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` instance.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -680,23 +716,27 @@
"name": "build",
"capabilityId": "Aspire.Hosting/buildExecutionConfiguration",
"qualifiedName": "build",
- "description": "Builds the execution configuration",
+ "description": "Builds the execution configuration for the specified builder.",
+ "returns": "The resolved execution configuration.",
"kind": "Method",
"signature": "build(executionContext: DistributedApplicationExecutionContext, resourceLogger?: ILogger, cancellationToken?: cancellationToken): IExecutionConfigurationResult",
"parameters": [
{
"name": "executionContext",
- "type": "DistributedApplicationExecutionContext"
+ "type": "DistributedApplicationExecutionContext",
+ "description": "The execution context used while building the configuration."
},
{
"name": "resourceLogger",
"type": "ILogger",
- "isOptional": true
+ "isOptional": true,
+ "description": "The logger used while resolving values."
},
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "A cancellation token."
}
],
"returnType": "IExecutionConfigurationResult",
@@ -709,7 +749,8 @@
"name": "clearContainerFilesSources",
"capabilityId": "Aspire.Hosting/clearContainerFilesSources",
"qualifiedName": "clearContainerFilesSources",
- "description": "Clears all container file sources",
+ "description": "Removes any container files source annotation from the resource being built.",
+ "returns": "The resource builder instance with the container files source annotation applied.",
"kind": "Method",
"signature": "clearContainerFilesSources(): IResourceWithContainerFiles",
"parameters": [],
@@ -743,7 +784,7 @@
"name": "args",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.args",
"qualifiedName": "CommandLineArgsCallbackContext.args",
- "description": "Gets the command-line argument editor",
+ "description": "Gets the editor used to manipulate command-line arguments in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "args(): CommandLineArgsEditor",
"parameters": [],
@@ -757,7 +798,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.executionContext",
"qualifiedName": "CommandLineArgsCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this callback.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -771,7 +812,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.log",
"qualifiedName": "CommandLineArgsCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -785,7 +826,8 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.resource",
"qualifiedName": "CommandLineArgsCallbackContext.resource",
- "description": "Gets the resource associated with this callback",
+ "description": "The resource associated with this callback context.",
+ "remarks": "This will be set to the resource in all cases where Aspire invokes the callback.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -799,13 +841,14 @@
"name": "add",
"capabilityId": "Aspire.Hosting.ApplicationModel/add",
"qualifiedName": "CommandLineArgsEditor.add",
- "description": "Adds a command-line argument",
+ "description": "Adds a command-line argument.",
"kind": "InstanceMethod",
"signature": "add(value: IExpressionValue): void",
"parameters": [
{
"name": "value",
- "type": "IExpressionValue"
+ "type": "IExpressionValue",
+ "description": "The argument to add."
}
],
"returnType": "void",
@@ -837,7 +880,7 @@
"name": "completeLog",
"capabilityId": "Aspire.Hosting/completeLog",
"qualifiedName": "completeLog",
- "description": "Completes the log stream for a resource",
+ "description": "Completes the log stream for a resource.",
"kind": "Method",
"signature": "completeLog(resource: IResource): void",
"parameters": [
@@ -856,7 +899,7 @@
"name": "completeLogByName",
"capabilityId": "Aspire.Hosting/completeLogByName",
"qualifiedName": "completeLogByName",
- "description": "Completes the log stream by resource name",
+ "description": "Completes the log stream by resource name.",
"kind": "Method",
"signature": "completeLogByName(resourceName: string): void",
"parameters": [
@@ -875,7 +918,7 @@
"name": "completeStep",
"capabilityId": "Aspire.Hosting/completeStep",
"qualifiedName": "completeStep",
- "description": "Completes the reporting step with plain-text completion text",
+ "description": "Completes the reporting step with plain-text completion text.",
"kind": "Method",
"signature": "completeStep(completionText: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -905,7 +948,7 @@
"name": "completeStepMarkdown",
"capabilityId": "Aspire.Hosting/completeStepMarkdown",
"qualifiedName": "completeStepMarkdown",
- "description": "Completes the reporting step with Markdown-formatted completion text",
+ "description": "Completes the reporting step with Markdown-formatted completion text.",
"kind": "Method",
"signature": "completeStepMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -935,7 +978,7 @@
"name": "completeTask",
"capabilityId": "Aspire.Hosting/completeTask",
"qualifiedName": "completeTask",
- "description": "Completes the reporting task with plain-text completion text",
+ "description": "Completes the reporting task with plain-text completion text.",
"kind": "Method",
"signature": "completeTask(completionMessage?: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -966,7 +1009,7 @@
"name": "completeTaskMarkdown",
"capabilityId": "Aspire.Hosting/completeTaskMarkdown",
"qualifiedName": "completeTaskMarkdown",
- "description": "Completes the reporting task with Markdown-formatted completion text",
+ "description": "Completes the reporting task with Markdown-formatted completion text.",
"kind": "Method",
"signature": "completeTaskMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -996,15 +1039,16 @@
"name": "configure",
"capabilityId": "Aspire.Hosting/configure",
"qualifiedName": "configure",
- "description": "Configures the application pipeline via a callback",
+ "description": "Registers a pipeline configuration callback in a TypeScript-friendly shape.",
"kind": "Method",
- "signature": "configure(callback: (arg: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "configure(callback: (arg: PipelineConfigurationContext) => Promise): void",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineConfigurationContext) => Promise",
+ "description": "The callback to execute during pipeline configuration."
}
],
"returnType": "void",
@@ -1045,7 +1089,7 @@
"name": "remoteImageName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.remoteImageName",
"qualifiedName": "ContainerImagePushOptions.remoteImageName",
- "description": "Gets the RemoteImageName property",
+ "description": "Gets or sets the remote image name (repository path without registry endpoint or tag).",
"kind": "PropertyGetter",
"signature": "remoteImageName(): string",
"parameters": [],
@@ -1059,7 +1103,7 @@
"name": "remoteImageTag",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.remoteImageTag",
"qualifiedName": "ContainerImagePushOptions.remoteImageTag",
- "description": "Gets the RemoteImageTag property",
+ "description": "Gets or sets the remote image tag.",
"kind": "PropertyGetter",
"signature": "remoteImageTag(): string",
"parameters": [],
@@ -1073,7 +1117,7 @@
"name": "setRemoteImageName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.setRemoteImageName",
"qualifiedName": "ContainerImagePushOptions.setRemoteImageName",
- "description": "Sets the RemoteImageName property",
+ "description": "Gets or sets the remote image name (repository path without registry endpoint or tag).",
"kind": "PropertySetter",
"signature": "setRemoteImageName(value: string): ContainerImagePushOptions",
"parameters": [
@@ -1092,7 +1136,7 @@
"name": "setRemoteImageTag",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.setRemoteImageTag",
"qualifiedName": "ContainerImagePushOptions.setRemoteImageTag",
- "description": "Sets the RemoteImageTag property",
+ "description": "Gets or sets the remote image tag.",
"kind": "PropertySetter",
"signature": "setRemoteImageTag(value: string): ContainerImagePushOptions",
"parameters": [
@@ -1111,7 +1155,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.cancellationToken",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token to observe while configuring image push options.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -1125,7 +1169,7 @@
"name": "options",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.options",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.options",
- "description": "Gets the Options property",
+ "description": "Gets the container image push options that can be modified by the callback.",
"kind": "PropertyGetter",
"signature": "options(): ContainerImagePushOptions",
"parameters": [],
@@ -1139,7 +1183,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.resource",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource being configured for container image push operations.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -1149,63 +1193,6 @@
"Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
]
},
- {
- "name": "setCancellationToken",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setCancellationToken",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
- "kind": "PropertySetter",
- "signature": "setCancellationToken(value: cancellationToken): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "cancellationToken"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
- },
- {
- "name": "setOptions",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setOptions",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setOptions",
- "description": "Sets the Options property",
- "kind": "PropertySetter",
- "signature": "setOptions(value: ContainerImagePushOptions): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "ContainerImagePushOptions"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
- },
- {
- "name": "setResource",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setResource",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setResource",
- "description": "Sets the Resource property",
- "kind": "PropertySetter",
- "signature": "setResource(value: IResource): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "IResource"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
- },
{
"name": "copy",
"capabilityId": "Aspire.Hosting/dockerfileStageCopy",
@@ -1284,7 +1271,8 @@
"name": "createExecutionConfiguration",
"capabilityId": "Aspire.Hosting/createExecutionConfiguration",
"qualifiedName": "createExecutionConfiguration",
- "description": "Creates an execution configuration builder",
+ "description": "Creates an execution configuration builder for the specified resource.",
+ "returns": "The execution configuration builder.",
"kind": "Method",
"signature": "createExecutionConfiguration(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -1305,13 +1293,15 @@
"name": "createLogger",
"capabilityId": "Aspire.Hosting/createLogger",
"qualifiedName": "createLogger",
- "description": "Creates a logger for a category",
+ "description": "Creates a logger for the specified category name.",
+ "returns": "A logger handle.",
"kind": "Method",
"signature": "createLogger(categoryName: string): ILogger",
"parameters": [
{
"name": "categoryName",
- "type": "string"
+ "type": "string",
+ "description": "The category name."
}
],
"returnType": "ILogger",
@@ -1324,7 +1314,7 @@
"name": "createMarkdownTask",
"capabilityId": "Aspire.Hosting/createMarkdownTask",
"qualifiedName": "createMarkdownTask",
- "description": "Creates a reporting task with Markdown-formatted status text",
+ "description": "Creates a reporting task with Markdown-formatted status text.",
"kind": "Method",
"signature": "createMarkdownTask(markdownString: string, cancellationToken?: cancellationToken): IReportingTask",
"parameters": [
@@ -1348,7 +1338,7 @@
"name": "createTask",
"capabilityId": "Aspire.Hosting/createTask",
"qualifiedName": "createTask",
- "description": "Creates a reporting task with plain-text status text",
+ "description": "Creates a reporting task with plain-text status text.",
"kind": "Method",
"signature": "createTask(statusText: string, cancellationToken?: cancellationToken): IReportingTask",
"parameters": [
@@ -1372,157 +1362,171 @@
"name": "Dict.clear",
"capabilityId": "Aspire.Hosting/Dict.clear",
"qualifiedName": "Dict.clear",
- "description": "Clears all entries from a dictionary",
+ "description": "Clears all entries from a dictionary.",
"kind": "Method",
"signature": "Dict.clear(): void",
"parameters": [],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.count",
"capabilityId": "Aspire.Hosting/Dict.count",
"qualifiedName": "Dict.count",
- "description": "Gets the number of entries in a dictionary",
+ "description": "Gets the number of entries in a dictionary.",
+ "returns": "The number of key-value pairs.",
"kind": "Method",
"signature": "Dict.count(): number",
"parameters": [],
"returnType": "number",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.get",
"capabilityId": "Aspire.Hosting/Dict.get",
"qualifiedName": "Dict.get",
- "description": "Gets a value from a dictionary",
+ "description": "Gets a value from a dictionary by key.",
+ "returns": "The value, or null if not found.",
"kind": "Method",
"signature": "Dict.get(key: any): any",
"parameters": [
{
"name": "key",
- "type": "any"
+ "type": "any",
+ "description": "The key to look up."
}
],
"returnType": "any",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.has",
"capabilityId": "Aspire.Hosting/Dict.has",
"qualifiedName": "Dict.has",
- "description": "Checks if a dictionary contains a key",
+ "description": "Checks if a dictionary contains a key.",
+ "returns": "True if the key exists.",
"kind": "Method",
"signature": "Dict.has(key: any): boolean",
"parameters": [
{
"name": "key",
- "type": "any"
+ "type": "any",
+ "description": "The key to check."
}
],
"returnType": "boolean",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.keys",
"capabilityId": "Aspire.Hosting/Dict.keys",
"qualifiedName": "Dict.keys",
- "description": "Gets all keys from a dictionary",
+ "description": "Gets all keys from a dictionary.",
+ "returns": "An array of all keys.",
"kind": "Method",
"signature": "Dict.keys(): any[]",
"parameters": [],
"returnType": "any[]",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.remove",
"capabilityId": "Aspire.Hosting/Dict.remove",
"qualifiedName": "Dict.remove",
- "description": "Removes a key from a dictionary",
+ "description": "Removes a key from a dictionary.",
+ "returns": "True if the key was removed, false if not found.",
"kind": "Method",
"signature": "Dict.remove(key: any): boolean",
"parameters": [
{
"name": "key",
- "type": "any"
+ "type": "any",
+ "description": "The key to remove."
}
],
"returnType": "boolean",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.set",
"capabilityId": "Aspire.Hosting/Dict.set",
"qualifiedName": "Dict.set",
- "description": "Sets a value in a dictionary",
+ "description": "Sets a value in a dictionary.",
"kind": "Method",
"signature": "Dict.set(key: any, value: any): void",
"parameters": [
{
"name": "key",
- "type": "any"
+ "type": "any",
+ "description": "The key to set."
},
{
"name": "value",
- "type": "any"
+ "type": "any",
+ "description": "The value to set."
}
],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.toObject",
"capabilityId": "Aspire.Hosting/Dict.toObject",
"qualifiedName": "Dict.toObject",
- "description": "Converts a dictionary to a plain object",
+ "description": "Converts the dictionary to a plain object (creates a copy).",
+ "returns": "A copy of the dictionary as an object.",
"kind": "Method",
- "signature": "Dict.toObject(): Dict\u003Cstring,any\u003E",
+ "signature": "Dict.toObject(): Dict",
"parameters": [],
- "returnType": "Dict\u003Cstring,any\u003E",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "returnType": "Dict",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "Dict.values",
"capabilityId": "Aspire.Hosting/Dict.values",
"qualifiedName": "Dict.values",
- "description": "Gets all values from a dictionary",
+ "description": "Gets all values from a dictionary.",
+ "returns": "An array of all values.",
"kind": "Method",
"signature": "Dict.values(): any[]",
"parameters": [],
"returnType": "any[]",
- "targetTypeId": "Aspire.Hosting/Dict\u003Cstring,any\u003E",
+ "targetTypeId": "Aspire.Hosting/Dict",
"expandedTargetTypes": [
- "Dict\u003Cstring,any\u003E"
+ "Dict"
]
},
{
"name": "disableBuildOnlyContainerValidation",
"capabilityId": "Aspire.Hosting/disableBuildOnlyContainerValidation",
"qualifiedName": "disableBuildOnlyContainerValidation",
- "description": "Disables publish and deploy validation for unconsumed build-only containers.",
+ "description": "Disables the publish and deploy validation that requires build-only containers to be consumed by another resource.",
+ "remarks": "This is an application-wide escape hatch for scenarios where the build-only container validation is too restrictive\nfor a particular app. Prefer wiring build-only containers through `PublishWithContainerFiles` or\n`PublishWithStaticFiles` when possible.",
+ "returns": "The distributed application pipeline for chaining.",
"kind": "Method",
"signature": "disableBuildOnlyContainerValidation(): IDistributedApplicationPipeline",
"parameters": [],
@@ -1536,7 +1540,9 @@
"name": "disableForwardedHeaders",
"capabilityId": "Aspire.Hosting/disableForwardedHeaders",
"qualifiedName": "disableForwardedHeaders",
- "description": "Disables forwarded headers for the project",
+ "description": "Configures the project to disable forwarded headers when being published.",
+ "remarks": "By default Aspire assumes that .NET applications which expose endpoints should be configured to\nuse forwarded headers. This is because most typical cloud native deployment scenarios involve a reverse\nproxy which translates an external endpoint hostname to an internal address.\nTo enable forwarded headers the `ASPNETCORE_FORWARDEDHEADERS_ENABLED` variable is injected\ninto the project and set to true. If the `DisableForwardedHeaders`\nextension is used this environment variable will not be set.\nDisable forwarded headers for a project.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddProject(\"inventoryservice\")\n.DisableForwardedHeaders();\n```",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "disableForwardedHeaders(): ProjectResource",
"parameters": [],
@@ -1552,14 +1558,17 @@
"name": "run",
"capabilityId": "Aspire.Hosting/run",
"qualifiedName": "DistributedApplication.run",
- "description": "Runs the distributed application",
+ "description": "Runs an application and returns a Task that only completes when the token is triggered or shutdown is triggered and all `IHostedService` instances are stopped.",
+ "remarks": "When the Aspire app host is launched via `RunAsync` there are\ntwo possible modes that it is running in:\n-\n-\nDevelopers extending the Aspire application model should consider the lifetime\nof `IHostedService` instances which are added to the dependency injection\ncontainer. For more information on determining the mode that the app host is running\nin refer to `DistributedApplicationExecutionContext`.",
+ "returns": "The `Task` that represents the asynchronous operation.",
"kind": "InstanceMethod",
"signature": "run(cancellationToken?: cancellationToken): void",
"parameters": [
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The token to trigger shutdown."
}
],
"returnType": "void",
@@ -1572,7 +1581,7 @@
"name": "isPublishMode",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.isPublishMode",
"qualifiedName": "DistributedApplicationExecutionContext.isPublishMode",
- "description": "Gets the IsPublishMode property",
+ "description": "Returns true if the current operation is publishing.",
"kind": "PropertyGetter",
"signature": "isPublishMode(): boolean",
"parameters": [],
@@ -1586,7 +1595,7 @@
"name": "isRunMode",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.isRunMode",
"qualifiedName": "DistributedApplicationExecutionContext.isRunMode",
- "description": "Gets the IsRunMode property",
+ "description": "Returns true if the current operation is running.",
"kind": "PropertyGetter",
"signature": "isRunMode(): boolean",
"parameters": [],
@@ -1600,7 +1609,7 @@
"name": "operation",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.operation",
"qualifiedName": "DistributedApplicationExecutionContext.operation",
- "description": "Gets the Operation property",
+ "description": "The operation currently being performed by the AppHost.",
"kind": "PropertyGetter",
"signature": "operation(): DistributedApplicationOperation",
"parameters": [],
@@ -1614,7 +1623,7 @@
"name": "publisherName",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.publisherName",
"qualifiedName": "DistributedApplicationExecutionContext.publisherName",
- "description": "Gets the PublisherName property",
+ "description": "The name of the publisher that is being used if `Operation` is set to `Publish`.",
"kind": "PropertyGetter",
"signature": "publisherName(): string",
"parameters": [],
@@ -1628,7 +1637,7 @@
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.serviceProvider",
"qualifiedName": "DistributedApplicationExecutionContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The `IServiceProvider` for the AppHost.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -1642,7 +1651,7 @@
"name": "setPublisherName",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.setPublisherName",
"qualifiedName": "DistributedApplicationExecutionContext.setPublisherName",
- "description": "Sets the PublisherName property",
+ "description": "The name of the publisher that is being used if `Operation` is set to `Publish`.",
"kind": "PropertySetter",
"signature": "setPublisherName(value: string): DistributedApplicationExecutionContext",
"parameters": [
@@ -1661,7 +1670,7 @@
"name": "builder",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.builder",
"qualifiedName": "DockerfileBuilderCallbackContext.builder",
- "description": "Gets the Builder property",
+ "description": "Gets the Dockerfile builder instance.",
"kind": "PropertyGetter",
"signature": "builder(): DockerfileBuilder",
"parameters": [],
@@ -1675,7 +1684,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.cancellationToken",
"qualifiedName": "DockerfileBuilderCallbackContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token to observe while waiting for the task to complete.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -1689,7 +1698,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.resource",
"qualifiedName": "DockerfileBuilderCallbackContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource being built.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -1703,7 +1712,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.services",
"qualifiedName": "DockerfileBuilderCallbackContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency injection.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -1731,7 +1740,7 @@
"name": "endpointName",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.endpointName",
"qualifiedName": "EndpointReference.endpointName",
- "description": "Gets the EndpointName property",
+ "description": "Gets the name of the endpoint associated with the endpoint reference.",
"kind": "PropertyGetter",
"signature": "endpointName(): string",
"parameters": [],
@@ -1745,7 +1754,7 @@
"name": "errorMessage",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.errorMessage",
"qualifiedName": "EndpointReference.errorMessage",
- "description": "Gets the ErrorMessage property",
+ "description": "Gets or sets a custom error message to be thrown when the endpoint annotation is not found.",
"kind": "PropertyGetter",
"signature": "errorMessage(): string",
"parameters": [],
@@ -1759,7 +1768,8 @@
"name": "excludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.excludeReferenceEndpoint",
"qualifiedName": "EndpointReference.excludeReferenceEndpoint",
- "description": "Gets the ExcludeReferenceEndpoint property",
+ "description": "Gets a value indicating whether this endpoint is excluded from the default set when referencing the resource's endpoints.",
+ "remarks": "Returns `false` if the endpoint annotation has not been added to the resource yet.\nOnce the annotation exists, this property delegates to `ExcludeReferenceEndpoint`.",
"kind": "PropertyGetter",
"signature": "excludeReferenceEndpoint(): boolean",
"parameters": [],
@@ -1773,7 +1783,7 @@
"name": "exists",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.exists",
"qualifiedName": "EndpointReference.exists",
- "description": "Gets the Exists property",
+ "description": "Gets a value indicating whether the endpoint exists.",
"kind": "PropertyGetter",
"signature": "exists(): boolean",
"parameters": [],
@@ -1787,17 +1797,21 @@
"name": "getTlsValue",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.getTlsValue",
"qualifiedName": "EndpointReference.getTlsValue",
- "description": "Gets a conditional expression that resolves to the enabledValue when TLS is enabled on the endpoint, or to the disabledValue otherwise.",
+ "description": "Creates a conditional `ReferenceExpression` that resolves to `enabledValue` when `TlsEnabled` is `true` on this endpoint, or to `disabledValue` otherwise.",
+ "remarks": "The returned expression evaluates the TLS state lazily each time its value is resolved, making it\nsafe to embed in a `ReferenceExpression` that is built before TLS is configured\n(e.g., before `BeforeStartEvent` fires). Because the condition and branches are declarative,\npolyglot code generators can translate this into native conditional constructs in any target language.",
+ "returns": "A conditional `ReferenceExpression` whose value tracks the TLS state of this endpoint.",
"kind": "InstanceMethod",
"signature": "getTlsValue(enabledValue: ReferenceExpression, disabledValue: ReferenceExpression): ReferenceExpression",
"parameters": [
{
"name": "enabledValue",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The expression to evaluate when TLS is enabled (e.g., `\",ssl=true\"`)."
},
{
"name": "disabledValue",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The expression to evaluate when TLS is not enabled."
}
],
"returnType": "ReferenceExpression",
@@ -1810,14 +1824,16 @@
"name": "getValueAsync",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.getValueAsync",
"qualifiedName": "EndpointReference.getValueAsync",
- "description": "Gets the URL of the endpoint asynchronously",
+ "description": "Gets the URL of the endpoint asynchronously. Waits for the endpoint to be allocated if necessary.",
+ "returns": "The URL of the endpoint.",
"kind": "InstanceMethod",
"signature": "getValueAsync(cancellationToken?: cancellationToken): string",
"parameters": [
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The cancellation token."
}
],
"returnType": "string",
@@ -1830,7 +1846,7 @@
"name": "host",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.host",
"qualifiedName": "EndpointReference.host",
- "description": "Gets the Host property",
+ "description": "Gets the host for this endpoint.",
"kind": "PropertyGetter",
"signature": "host(): string",
"parameters": [],
@@ -1844,7 +1860,7 @@
"name": "isAllocated",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isAllocated",
"qualifiedName": "EndpointReference.isAllocated",
- "description": "Gets the IsAllocated property",
+ "description": "Gets a value indicating whether the endpoint is allocated.",
"kind": "PropertyGetter",
"signature": "isAllocated(): boolean",
"parameters": [],
@@ -1858,7 +1874,7 @@
"name": "isHttp",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttp",
"qualifiedName": "EndpointReference.isHttp",
- "description": "Gets the IsHttp property",
+ "description": "Gets a value indicating whether the endpoint uses HTTP scheme.",
"kind": "PropertyGetter",
"signature": "isHttp(): boolean",
"parameters": [],
@@ -1872,7 +1888,7 @@
"name": "isHttps",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttps",
"qualifiedName": "EndpointReference.isHttps",
- "description": "Gets the IsHttps property",
+ "description": "Gets a value indicating whether the endpoint uses HTTPS scheme.",
"kind": "PropertyGetter",
"signature": "isHttps(): boolean",
"parameters": [],
@@ -1886,7 +1902,7 @@
"name": "isHttpSchemeNamedEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttpSchemeNamedEndpoint",
"qualifiedName": "EndpointReference.isHttpSchemeNamedEndpoint",
- "description": "Gets the IsHttpSchemeNamedEndpoint property",
+ "description": "Gets a value indicating whether the endpoint name is \"http\" or \"https\", ignoring case. This is a convention used to identify endpoints that will be resolved based on the scheme of the endpoint in service discovery rather than by the specific endpoint name. This is done to allow http endpoints that are dynamically updated to https to be mapped correctly despite the endpoint name no longer matching the scheme.",
"kind": "PropertyGetter",
"signature": "isHttpSchemeNamedEndpoint(): boolean",
"parameters": [],
@@ -1900,7 +1916,7 @@
"name": "port",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.port",
"qualifiedName": "EndpointReference.port",
- "description": "Gets the Port property",
+ "description": "Gets the port for this endpoint.",
"kind": "PropertyGetter",
"signature": "port(): number",
"parameters": [],
@@ -1914,13 +1930,15 @@
"name": "property",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.property",
"qualifiedName": "EndpointReference.property",
- "description": "Gets the specified property expression of the endpoint",
+ "description": "Gets the specified property expression of the endpoint.",
+ "returns": "An `EndpointReferenceExpression` representing the specified `EndpointProperty`.",
"kind": "InstanceMethod",
"signature": "property(property: EndpointProperty): EndpointReferenceExpression",
"parameters": [
{
"name": "property",
- "type": "EndpointProperty"
+ "type": "EndpointProperty",
+ "description": "The `EndpointProperty` enum value to use in the reference."
}
],
"returnType": "EndpointReferenceExpression",
@@ -1933,7 +1951,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.resource",
"qualifiedName": "EndpointReference.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource owner of the endpoint reference.",
"kind": "PropertyGetter",
"signature": "resource(): IResourceWithEndpoints",
"parameters": [],
@@ -1947,7 +1965,7 @@
"name": "scheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.scheme",
"qualifiedName": "EndpointReference.scheme",
- "description": "Gets the Scheme property",
+ "description": "Gets the scheme for this endpoint.",
"kind": "PropertyGetter",
"signature": "scheme(): string",
"parameters": [],
@@ -1957,30 +1975,11 @@
"Aspire.Hosting.ApplicationModel.EndpointReference"
]
},
- {
- "name": "setErrorMessage",
- "capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.setErrorMessage",
- "qualifiedName": "EndpointReference.setErrorMessage",
- "description": "Sets the ErrorMessage property",
- "kind": "PropertySetter",
- "signature": "setErrorMessage(value: string): EndpointReference",
- "parameters": [
- {
- "name": "value",
- "type": "string"
- }
- ],
- "returnType": "EndpointReference",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.EndpointReference"
- ]
- },
{
"name": "targetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.targetPort",
"qualifiedName": "EndpointReference.targetPort",
- "description": "Gets the TargetPort property",
+ "description": "Gets the target port for this endpoint. If the port is dynamically allocated, this will return `null`.",
"kind": "PropertyGetter",
"signature": "targetPort(): number",
"parameters": [],
@@ -1994,7 +1993,8 @@
"name": "tlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.tlsEnabled",
"qualifiedName": "EndpointReference.tlsEnabled",
- "description": "Gets the TlsEnabled property",
+ "description": "Gets a value indicating whether TLS is enabled for this endpoint.",
+ "remarks": "Returns `false` if the endpoint annotation has not been added to the resource yet.\nOnce the annotation exists, this property delegates to `TlsEnabled`.",
"kind": "PropertyGetter",
"signature": "tlsEnabled(): boolean",
"parameters": [],
@@ -2008,7 +2008,7 @@
"name": "url",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.url",
"qualifiedName": "EndpointReference.url",
- "description": "Gets the Url property",
+ "description": "Gets the URL for this endpoint.",
"kind": "PropertyGetter",
"signature": "url(): string",
"parameters": [],
@@ -2022,7 +2022,7 @@
"name": "endpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.endpoint",
"qualifiedName": "EndpointReferenceExpression.endpoint",
- "description": "Gets the Endpoint property",
+ "description": "Gets the `EndpointReference`.",
"kind": "PropertyGetter",
"signature": "endpoint(): EndpointReference",
"parameters": [],
@@ -2036,7 +2036,7 @@
"name": "property",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.property",
"qualifiedName": "EndpointReferenceExpression.property",
- "description": "Gets the Property property",
+ "description": "Gets the `EndpointProperty` for the property expression.",
"kind": "PropertyGetter",
"signature": "property(): EndpointProperty",
"parameters": [],
@@ -2050,7 +2050,7 @@
"name": "valueExpression",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.valueExpression",
"qualifiedName": "EndpointReferenceExpression.valueExpression",
- "description": "Gets the ValueExpression property",
+ "description": "Gets the expression of the property of the endpoint.",
"kind": "PropertyGetter",
"signature": "valueExpression(): string",
"parameters": [],
@@ -2064,7 +2064,7 @@
"name": "excludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.excludeReferenceEndpoint",
"qualifiedName": "EndpointUpdateContext.excludeReferenceEndpoint",
- "description": "Gets the ExcludeReferenceEndpoint property",
+ "description": "Gets or sets a value indicating whether the endpoint is excluded from the default reference set.",
"kind": "PropertyGetter",
"signature": "excludeReferenceEndpoint(): boolean",
"parameters": [],
@@ -2078,7 +2078,7 @@
"name": "isExternal",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.isExternal",
"qualifiedName": "EndpointUpdateContext.isExternal",
- "description": "Gets the IsExternal property",
+ "description": "Gets or sets a value indicating whether the endpoint is external.",
"kind": "PropertyGetter",
"signature": "isExternal(): boolean",
"parameters": [],
@@ -2092,7 +2092,7 @@
"name": "isProxied",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.isProxied",
"qualifiedName": "EndpointUpdateContext.isProxied",
- "description": "Gets the IsProxied property",
+ "description": "Gets or sets a value indicating whether the endpoint is proxied.",
"kind": "PropertyGetter",
"signature": "isProxied(): boolean",
"parameters": [],
@@ -2106,7 +2106,7 @@
"name": "name",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.name",
"qualifiedName": "EndpointUpdateContext.name",
- "description": "Gets the Name property",
+ "description": "Gets the endpoint name.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -2120,7 +2120,7 @@
"name": "port",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.port",
"qualifiedName": "EndpointUpdateContext.port",
- "description": "Gets the Port property",
+ "description": "Gets or sets the desired host port.",
"kind": "PropertyGetter",
"signature": "port(): number",
"parameters": [],
@@ -2134,7 +2134,7 @@
"name": "protocol",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.protocol",
"qualifiedName": "EndpointUpdateContext.protocol",
- "description": "Gets the Protocol property",
+ "description": "Gets or sets the network protocol.",
"kind": "PropertyGetter",
"signature": "protocol(): ProtocolType",
"parameters": [],
@@ -2148,7 +2148,7 @@
"name": "setExcludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setExcludeReferenceEndpoint",
"qualifiedName": "EndpointUpdateContext.setExcludeReferenceEndpoint",
- "description": "Sets the ExcludeReferenceEndpoint property",
+ "description": "Gets or sets a value indicating whether the endpoint is excluded from the default reference set.",
"kind": "PropertySetter",
"signature": "setExcludeReferenceEndpoint(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -2167,7 +2167,7 @@
"name": "setIsExternal",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setIsExternal",
"qualifiedName": "EndpointUpdateContext.setIsExternal",
- "description": "Sets the IsExternal property",
+ "description": "Gets or sets a value indicating whether the endpoint is external.",
"kind": "PropertySetter",
"signature": "setIsExternal(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -2186,7 +2186,7 @@
"name": "setIsProxied",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setIsProxied",
"qualifiedName": "EndpointUpdateContext.setIsProxied",
- "description": "Sets the IsProxied property",
+ "description": "Gets or sets a value indicating whether the endpoint is proxied.",
"kind": "PropertySetter",
"signature": "setIsProxied(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -2205,7 +2205,7 @@
"name": "setPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setPort",
"qualifiedName": "EndpointUpdateContext.setPort",
- "description": "Sets the Port property",
+ "description": "Gets or sets the desired host port.",
"kind": "PropertySetter",
"signature": "setPort(value: number): EndpointUpdateContext",
"parameters": [
@@ -2224,7 +2224,7 @@
"name": "setProtocol",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setProtocol",
"qualifiedName": "EndpointUpdateContext.setProtocol",
- "description": "Sets the Protocol property",
+ "description": "Gets or sets the network protocol.",
"kind": "PropertySetter",
"signature": "setProtocol(value: ProtocolType): EndpointUpdateContext",
"parameters": [
@@ -2243,7 +2243,7 @@
"name": "setTargetHost",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTargetHost",
"qualifiedName": "EndpointUpdateContext.setTargetHost",
- "description": "Sets the TargetHost property",
+ "description": "Gets or sets the target host.",
"kind": "PropertySetter",
"signature": "setTargetHost(value: string): EndpointUpdateContext",
"parameters": [
@@ -2262,7 +2262,7 @@
"name": "setTargetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTargetPort",
"qualifiedName": "EndpointUpdateContext.setTargetPort",
- "description": "Sets the TargetPort property",
+ "description": "Gets or sets the target port.",
"kind": "PropertySetter",
"signature": "setTargetPort(value: number): EndpointUpdateContext",
"parameters": [
@@ -2281,7 +2281,7 @@
"name": "setTlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTlsEnabled",
"qualifiedName": "EndpointUpdateContext.setTlsEnabled",
- "description": "Sets the TlsEnabled property",
+ "description": "Gets or sets a value indicating whether TLS is enabled.",
"kind": "PropertySetter",
"signature": "setTlsEnabled(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -2300,7 +2300,7 @@
"name": "setTransport",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTransport",
"qualifiedName": "EndpointUpdateContext.setTransport",
- "description": "Sets the Transport property",
+ "description": "Gets or sets the transport.",
"kind": "PropertySetter",
"signature": "setTransport(value: string): EndpointUpdateContext",
"parameters": [
@@ -2319,7 +2319,7 @@
"name": "setUriScheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setUriScheme",
"qualifiedName": "EndpointUpdateContext.setUriScheme",
- "description": "Sets the UriScheme property",
+ "description": "Gets or sets the URI scheme.",
"kind": "PropertySetter",
"signature": "setUriScheme(value: string): EndpointUpdateContext",
"parameters": [
@@ -2338,7 +2338,7 @@
"name": "targetHost",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.targetHost",
"qualifiedName": "EndpointUpdateContext.targetHost",
- "description": "Gets the TargetHost property",
+ "description": "Gets or sets the target host.",
"kind": "PropertyGetter",
"signature": "targetHost(): string",
"parameters": [],
@@ -2352,7 +2352,7 @@
"name": "targetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.targetPort",
"qualifiedName": "EndpointUpdateContext.targetPort",
- "description": "Gets the TargetPort property",
+ "description": "Gets or sets the target port.",
"kind": "PropertyGetter",
"signature": "targetPort(): number",
"parameters": [],
@@ -2366,7 +2366,7 @@
"name": "tlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.tlsEnabled",
"qualifiedName": "EndpointUpdateContext.tlsEnabled",
- "description": "Gets the TlsEnabled property",
+ "description": "Gets or sets a value indicating whether TLS is enabled.",
"kind": "PropertyGetter",
"signature": "tlsEnabled(): boolean",
"parameters": [],
@@ -2380,7 +2380,7 @@
"name": "transport",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.transport",
"qualifiedName": "EndpointUpdateContext.transport",
- "description": "Gets the Transport property",
+ "description": "Gets or sets the transport.",
"kind": "PropertyGetter",
"signature": "transport(): string",
"parameters": [],
@@ -2394,7 +2394,7 @@
"name": "uriScheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.uriScheme",
"qualifiedName": "EndpointUpdateContext.uriScheme",
- "description": "Gets the UriScheme property",
+ "description": "Gets or sets the URI scheme.",
"kind": "PropertyGetter",
"signature": "uriScheme(): string",
"parameters": [],
@@ -2450,7 +2450,7 @@
"name": "environment",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.environment",
"qualifiedName": "EnvironmentCallbackContext.environment",
- "description": "Gets the environment variable editor",
+ "description": "Gets the editor used to set environment variables in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "environment(): EnvironmentEditor",
"parameters": [],
@@ -2464,7 +2464,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.executionContext",
"qualifiedName": "EnvironmentCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this invocation of the AppHost.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -2478,7 +2478,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.log",
"qualifiedName": "EnvironmentCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -2492,7 +2492,8 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.resource",
"qualifiedName": "EnvironmentCallbackContext.resource",
- "description": "Gets the resource associated with this callback",
+ "description": "The resource associated with this callback context.",
+ "remarks": "This will be set to the resource in all cases where Aspire invokes the callback.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -2506,17 +2507,19 @@
"name": "set",
"capabilityId": "Aspire.Hosting.ApplicationModel/set",
"qualifiedName": "EnvironmentEditor.set",
- "description": "Sets an environment variable",
+ "description": "Sets an environment variable.",
"kind": "InstanceMethod",
"signature": "set(name: string, value: IExpressionValue): void",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the environment variable."
},
{
"name": "value",
- "type": "IExpressionValue"
+ "type": "IExpressionValue",
+ "description": "The value to assign to the environment variable."
}
],
"returnType": "void",
@@ -2529,7 +2532,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Ats/EventingSubscriberRegistrationContext.cancellationToken",
"qualifiedName": "EventingSubscriberRegistrationContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "The cancellation token associated with the subscriber registration.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -2543,7 +2546,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Ats/EventingSubscriberRegistrationContext.executionContext",
"qualifiedName": "EventingSubscriberRegistrationContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "The execution context for the AppHost invocation.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -2557,7 +2560,8 @@
"name": "excludeFromManifest",
"capabilityId": "Aspire.Hosting/excludeFromManifest",
"qualifiedName": "excludeFromManifest",
- "description": "Excludes the resource from the deployment manifest",
+ "description": "Excludes a resource from being published to the manifest.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "excludeFromManifest(): IResource",
"parameters": [],
@@ -2579,7 +2583,8 @@
"name": "excludeFromMcp",
"capabilityId": "Aspire.Hosting/excludeFromMcp",
"qualifiedName": "excludeFromMcp",
- "description": "Excludes the resource from MCP server exposure",
+ "description": "Exclude the resource from MCP operations using the Aspire MCP server. The resource is excluded from results that return resources, console logs and telemetry.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "excludeFromMcp(): IResource",
"parameters": [],
@@ -2601,7 +2606,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.cancellationToken",
"qualifiedName": "ExecuteCommandContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "The cancellation token.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -2615,7 +2620,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.logger",
"qualifiedName": "ExecuteCommandContext.logger",
- "description": "Gets the Logger property",
+ "description": "The logger for the resource.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -2629,7 +2634,7 @@
"name": "resourceName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.resourceName",
"qualifiedName": "ExecuteCommandContext.resourceName",
- "description": "Gets the ResourceName property",
+ "description": "The resource name.",
"kind": "PropertyGetter",
"signature": "resourceName(): string",
"parameters": [],
@@ -2643,7 +2648,7 @@
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.serviceProvider",
"qualifiedName": "ExecuteCommandContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The service provider.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -2653,93 +2658,19 @@
"Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
]
},
- {
- "name": "setCancellationToken",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setCancellationToken",
- "qualifiedName": "ExecuteCommandContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
- "kind": "PropertySetter",
- "signature": "setCancellationToken(value: cancellationToken): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "cancellationToken"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setLogger",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setLogger",
- "qualifiedName": "ExecuteCommandContext.setLogger",
- "description": "Sets the Logger property",
- "kind": "PropertySetter",
- "signature": "setLogger(value: ILogger): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "ILogger"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setResourceName",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setResourceName",
- "qualifiedName": "ExecuteCommandContext.setResourceName",
- "description": "Sets the ResourceName property",
- "kind": "PropertySetter",
- "signature": "setResourceName(value: string): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "string"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setServiceProvider",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setServiceProvider",
- "qualifiedName": "ExecuteCommandContext.setServiceProvider",
- "description": "Sets the ServiceProvider property",
- "kind": "PropertySetter",
- "signature": "setServiceProvider(value: IServiceProvider): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "IServiceProvider"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
{
"name": "exists",
"capabilityId": "Aspire.Hosting/exists",
"qualifiedName": "exists",
- "description": "Checks whether a configuration section exists",
+ "description": "Checks whether a configuration section exists.",
+ "returns": "`true` when the section exists; otherwise, `false`.",
"kind": "Method",
"signature": "exists(key: string): boolean",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The configuration key."
}
],
"returnType": "boolean",
@@ -2771,13 +2702,15 @@
"name": "findResourceByName",
"capabilityId": "Aspire.Hosting/findResourceByName",
"qualifiedName": "findResourceByName",
- "description": "Finds a resource by name",
+ "description": "Finds a resource by name.",
+ "returns": "The matching resource, or `null` when not found.",
"kind": "Method",
"signature": "findResourceByName(name: string): IResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The resource name."
}
],
"returnType": "IResource",
@@ -2814,7 +2747,8 @@
"name": "getAspireStore",
"capabilityId": "Aspire.Hosting/getAspireStore",
"qualifiedName": "getAspireStore",
- "description": "Gets the Aspire store from the service provider",
+ "description": "Gets the Aspire store from the service provider.",
+ "returns": "The Aspire store.",
"kind": "Method",
"signature": "getAspireStore(): IAspireStore",
"parameters": [],
@@ -2828,7 +2762,8 @@
"name": "getCertificateTrustData",
"capabilityId": "Aspire.Hosting/getCertificateTrustData",
"qualifiedName": "getCertificateTrustData",
- "description": "Gets certificate trust execution-configuration data",
+ "description": "Gets certificate trust execution-configuration data when present.",
+ "returns": "The certificate trust data. When no additional data is present, an empty DTO is returned.",
"kind": "Method",
"signature": "getCertificateTrustData(): CertificateTrustExecutionConfigurationExportData",
"parameters": [],
@@ -2842,7 +2777,8 @@
"name": "getChildren",
"capabilityId": "Aspire.Hosting/getChildren",
"qualifiedName": "getChildren",
- "description": "Gets child configuration sections",
+ "description": "Gets the child sections of a configuration handle.",
+ "returns": "The child sections.",
"kind": "Method",
"signature": "getChildren(): IConfigurationSection[]",
"parameters": [],
@@ -2856,7 +2792,8 @@
"name": "getConfiguration",
"capabilityId": "Aspire.Hosting/getConfiguration",
"qualifiedName": "getConfiguration",
- "description": "Gets the application configuration",
+ "description": "Gets the application configuration.",
+ "returns": "The configuration handle.",
"kind": "Method",
"signature": "getConfiguration(): IConfiguration",
"parameters": [],
@@ -2870,13 +2807,15 @@
"name": "getConfigValue",
"capabilityId": "Aspire.Hosting/getConfigValue",
"qualifiedName": "getConfigValue",
- "description": "Gets a configuration value by key",
+ "description": "Gets a configuration value by key.",
+ "returns": "The configuration value, or null if not found.",
"kind": "Method",
"signature": "getConfigValue(key: string): string",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The configuration key (e.g., \"ConnectionStrings:Default\")."
}
],
"returnType": "string",
@@ -2889,13 +2828,16 @@
"name": "getConnectionProperty",
"capabilityId": "Aspire.Hosting/getConnectionProperty",
"qualifiedName": "getConnectionProperty",
- "description": "Gets a connection property by key",
+ "description": "Retrieves the value of a specified connection property from the resource's connection properties.",
+ "remarks": "Throws a KeyNotFoundException if the specified key does not exist in the resource's\nconnection properties.",
+ "returns": "The value associated with the specified connection property key.",
"kind": "Method",
"signature": "getConnectionProperty(key: string): ReferenceExpression",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key of the connection property to retrieve. Cannot be null."
}
],
"returnType": "ReferenceExpression",
@@ -2908,13 +2850,15 @@
"name": "getConnectionString",
"capabilityId": "Aspire.Hosting/getConnectionString",
"qualifiedName": "getConnectionString",
- "description": "Gets a connection string by name",
+ "description": "Gets a connection string by name.",
+ "returns": "The connection string value, or null if not found.",
"kind": "Method",
"signature": "getConnectionString(name: string): string",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The connection string name."
}
],
"returnType": "string",
@@ -2927,7 +2871,8 @@
"name": "getDistributedApplicationModel",
"capabilityId": "Aspire.Hosting/getDistributedApplicationModel",
"qualifiedName": "getDistributedApplicationModel",
- "description": "Gets the distributed application model from the service provider",
+ "description": "Gets the distributed application model from the service provider.",
+ "returns": "The distributed application model handle.",
"kind": "Method",
"signature": "getDistributedApplicationModel(): DistributedApplicationModel",
"parameters": [],
@@ -2941,13 +2886,15 @@
"name": "getEndpoint",
"capabilityId": "Aspire.Hosting/getEndpoint",
"qualifiedName": "getEndpoint",
- "description": "Gets an endpoint reference",
+ "description": "Gets an `EndpointReference` by name from the resource. These endpoints are declared either using `WithEndpoint``1` or by launch settings (for project resources). The `EndpointReference` can be used to resolve the address of the endpoint in `WithEnvironment``1`.",
+ "returns": "An `EndpointReference` that can be used to resolve the address of the endpoint after resource allocation has occurred.",
"kind": "Method",
"signature": "getEndpoint(name: string): EndpointReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint."
}
],
"returnType": "EndpointReference",
@@ -2964,7 +2911,8 @@
"name": "getEventing",
"capabilityId": "Aspire.Hosting/getEventing",
"qualifiedName": "getEventing",
- "description": "Gets the distributed application eventing service from the service provider",
+ "description": "Gets the distributed application eventing service from the service provider.",
+ "returns": "The distributed application eventing handle.",
"kind": "Method",
"signature": "getEventing(): IDistributedApplicationEventing",
"parameters": [],
@@ -2978,17 +2926,20 @@
"name": "getFileNameWithContent",
"capabilityId": "Aspire.Hosting/getFileNameWithContent",
"qualifiedName": "getFileNameWithContent",
- "description": "Gets a deterministic file path for the specified file contents",
+ "description": "Gets a deterministic file path that is a copy of the `sourceFilename`. The resulting file name will depend on the content of the file.",
+ "returns": "A deterministic file path with the same content as `sourceFilename`.",
"kind": "Method",
"signature": "getFileNameWithContent(filenameTemplate: string, sourceFilename: string): string",
"parameters": [
{
"name": "filenameTemplate",
- "type": "string"
+ "type": "string",
+ "description": "A file name to base the result on."
},
{
"name": "sourceFilename",
- "type": "string"
+ "type": "string",
+ "description": "An existing file."
}
],
"returnType": "string",
@@ -3001,7 +2952,8 @@
"name": "getHttpsCertificateData",
"capabilityId": "Aspire.Hosting/getHttpsCertificateData",
"qualifiedName": "getHttpsCertificateData",
- "description": "Gets HTTPS certificate execution-configuration data",
+ "description": "Gets HTTPS certificate execution-configuration data when present.",
+ "returns": "The HTTPS certificate data. When no additional data is present, an empty DTO is returned.",
"kind": "Method",
"signature": "getHttpsCertificateData(): HttpsCertificateExecutionConfigurationExportData",
"parameters": [],
@@ -3015,7 +2967,8 @@
"name": "getLoggerFactory",
"capabilityId": "Aspire.Hosting/getLoggerFactory",
"qualifiedName": "getLoggerFactory",
- "description": "Gets the logger factory from the service provider",
+ "description": "Gets the logger factory from the service provider.",
+ "returns": "A logger factory handle.",
"kind": "Method",
"signature": "getLoggerFactory(): ILoggerFactory",
"parameters": [],
@@ -3029,21 +2982,24 @@
"name": "getOrSetSecret",
"capabilityId": "Aspire.Hosting/getOrSetSecret",
"qualifiedName": "getOrSetSecret",
- "description": "Gets a secret value if it exists, or sets it to the provided value if it does not",
+ "description": "Gets a secret value if it exists in configuration, or sets it to the provided value if it does not.",
"kind": "Method",
"signature": "getOrSetSecret(resourceBuilder: IResource, name: string, value: string): void",
"parameters": [
{
"name": "resourceBuilder",
- "type": "IResource"
+ "type": "IResource",
+ "description": "A resource builder from the target application."
},
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The secret name."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The value to persist when the secret is missing."
}
],
"returnType": "void",
@@ -3056,7 +3012,8 @@
"name": "getResourceLoggerService",
"capabilityId": "Aspire.Hosting/getResourceLoggerService",
"qualifiedName": "getResourceLoggerService",
- "description": "Gets the resource logger service from the service provider",
+ "description": "Gets the resource logger service from the service provider.",
+ "returns": "A resource logger service handle.",
"kind": "Method",
"signature": "getResourceLoggerService(): ResourceLoggerService",
"parameters": [],
@@ -3070,7 +3027,9 @@
"name": "getResourceName",
"capabilityId": "Aspire.Hosting/getResourceName",
"qualifiedName": "getResourceName",
- "description": "Gets the resource name",
+ "description": "Gets the name of the resource from a builder.",
+ "remarks": "Why this wrapper exists: This capability accesses a nested property\n(`resource.Resource.Name`) which requires a wrapper method. There is no single\n.NET method that returns just the resource name that could be annotated directly.",
+ "returns": "The resource name.",
"kind": "Method",
"signature": "getResourceName(): string",
"parameters": [],
@@ -3091,7 +3050,8 @@
"name": "getResourceNotificationService",
"capabilityId": "Aspire.Hosting/getResourceNotificationService",
"qualifiedName": "getResourceNotificationService",
- "description": "Gets the resource notification service from the service provider",
+ "description": "Gets the resource notification service from the service provider.",
+ "returns": "A resource notification service handle.",
"kind": "Method",
"signature": "getResourceNotificationService(): ResourceNotificationService",
"parameters": [],
@@ -3105,7 +3065,8 @@
"name": "getResources",
"capabilityId": "Aspire.Hosting/getResources",
"qualifiedName": "getResources",
- "description": "Gets resources from the distributed application model",
+ "description": "Gets all resources in the distributed application model.",
+ "returns": "The resources in the model.",
"kind": "Method",
"signature": "getResources(): IResource[]",
"parameters": [],
@@ -3119,13 +3080,15 @@
"name": "getSection",
"capabilityId": "Aspire.Hosting/getSection",
"qualifiedName": "getSection",
- "description": "Gets a configuration section by key",
+ "description": "Gets a configuration section by key.",
+ "returns": "The configuration section handle.",
"kind": "Method",
"signature": "getSection(key: string): IConfigurationSection",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The configuration key."
}
],
"returnType": "IConfigurationSection",
@@ -3138,7 +3101,8 @@
"name": "getUserSecretsManager",
"capabilityId": "Aspire.Hosting/getUserSecretsManager",
"qualifiedName": "getUserSecretsManager",
- "description": "Gets the user secrets manager from the service provider",
+ "description": "Gets the user secrets manager from the service provider.",
+ "returns": "A user secrets manager handle.",
"kind": "Method",
"signature": "getUserSecretsManager(): IUserSecretsManager",
"parameters": [],
@@ -3152,7 +3116,7 @@
"name": "appHostDirectory",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.appHostDirectory",
"qualifiedName": "IDistributedApplicationBuilder.appHostDirectory",
- "description": "Gets the AppHostDirectory property",
+ "description": "Directory of the project where the app host is located. Defaults to the content root if there's no project.",
"kind": "PropertyGetter",
"signature": "appHostDirectory(): string",
"parameters": [],
@@ -3166,7 +3130,9 @@
"name": "build",
"capabilityId": "Aspire.Hosting/build",
"qualifiedName": "IDistributedApplicationBuilder.build",
- "description": "Builds the distributed application",
+ "description": "Builds and returns a new `DistributedApplication` instance. This can only be called once.",
+ "remarks": "Callers of the `Build` method should only call it once. are responsible for the lifecycle of the\n`DistributedApplication` instance that is returned. Note that the `DistributedApplication`\ntype implements `IDisposable` and should be disposed of when it is no longer needed. Note that in\nmany templates and samples Dispose is omitted for brevity because in those cases the instance is destroyed\nwhen the process exists.",
+ "returns": "A new `DistributedApplication` instance.",
"kind": "InstanceMethod",
"signature": "build(): DistributedApplication",
"parameters": [],
@@ -3194,7 +3160,7 @@
"name": "eventing",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.eventing",
"qualifiedName": "IDistributedApplicationBuilder.eventing",
- "description": "Gets the Eventing property",
+ "description": "Eventing infrastructure for AppHost lifecycle.",
"kind": "PropertyGetter",
"signature": "eventing(): IDistributedApplicationEventing",
"parameters": [],
@@ -3208,7 +3174,8 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.executionContext",
"qualifiedName": "IDistributedApplicationBuilder.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Execution context for this invocation of the AppHost.",
+ "remarks": "The `ExecutionContext` property provides access key information about the context\nin which the distributed application is running. The most important properties that\nthe `DistributedApplicationExecutionContext` provides is the\n`IsPublishMode` and `IsRunMode`\nproperties. Developers building Aspire based applications may whish to change the application\nmodel depending on whether they are running locally, or whether they are publishing to the cloud.\nAn example of using the `IsRunMode` property on the `IDistributedApplicationBuilder` via\nthe `ApplicationBuilder`. In this case an extension method is used to generate a stable node name for RabbitMQ for local\ndevelopment runs.\n```\nprivate static IResourceBuilder RunWithStableNodeName(this IResourceBuilder builder)\n{\nif (builder.ApplicationBuilder.ExecutionContext.IsRunMode)\n{\nbuilder.WithEnvironment(context =>\n{\n// Set a stable node name so queue storage is consistent between sessions\nvar nodeName = $\"{builder.Resource.Name}@localhost\";\ncontext.EnvironmentVariables[\"RABBITMQ_NODENAME\"] = nodeName;\n});\n}\nreturn builder;\n}\n```",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -3222,7 +3189,8 @@
"name": "pipeline",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.pipeline",
"qualifiedName": "IDistributedApplicationBuilder.pipeline",
- "description": "Gets the Pipeline property",
+ "description": "Gets the deployment pipeline for this distributed application.",
+ "remarks": "The pipeline allows adding custom deployment steps that execute during the deploy process.\nSteps can declare dependencies on other steps to control execution order.",
"kind": "PropertyGetter",
"signature": "pipeline(): IDistributedApplicationPipeline",
"parameters": [],
@@ -3236,7 +3204,8 @@
"name": "userSecretsManager",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.userSecretsManager",
"qualifiedName": "IDistributedApplicationBuilder.userSecretsManager",
- "description": "Gets the UserSecretsManager property",
+ "description": "Gets the service for managing user secrets.",
+ "remarks": "The `UserSecretsManager` provides a centralized way to manage user secrets\nused by Aspire, enabling testability and consistent secret management.",
"kind": "PropertyGetter",
"signature": "userSecretsManager(): IUserSecretsManager",
"parameters": [],
@@ -3250,13 +3219,14 @@
"name": "unsubscribe",
"capabilityId": "Aspire.Hosting.Eventing/IDistributedApplicationEventing.unsubscribe",
"qualifiedName": "IDistributedApplicationEventing.unsubscribe",
- "description": "Invokes the Unsubscribe method",
+ "description": "Unsubscribe from an event.",
"kind": "InstanceMethod",
"signature": "unsubscribe(subscription: DistributedApplicationEventSubscription): void",
"parameters": [
{
"name": "subscription",
- "type": "DistributedApplicationEventSubscription"
+ "type": "DistributedApplicationEventSubscription",
+ "description": "The specific subscription to unsubscribe."
}
],
"returnType": "void",
@@ -3269,7 +3239,7 @@
"name": "eventing",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.eventing",
"qualifiedName": "InitializeResourceEvent.eventing",
- "description": "Gets the Eventing property",
+ "description": "The `IDistributedApplicationEventing` service for the app host.",
"kind": "PropertyGetter",
"signature": "eventing(): IDistributedApplicationEventing",
"parameters": [],
@@ -3283,7 +3253,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.logger",
"qualifiedName": "InitializeResourceEvent.logger",
- "description": "Gets the Logger property",
+ "description": "An instance of `ILogger` that can be used to log messages for the resource.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -3297,7 +3267,7 @@
"name": "notifications",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.notifications",
"qualifiedName": "InitializeResourceEvent.notifications",
- "description": "Gets the Notifications property",
+ "description": "The `ResourceNotificationService` for the app host.",
"kind": "PropertyGetter",
"signature": "notifications(): ResourceNotificationService",
"parameters": [],
@@ -3325,7 +3295,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.services",
"qualifiedName": "InitializeResourceEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` for the app host.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -3339,7 +3309,8 @@
"name": "isDevelopment",
"capabilityId": "Aspire.Hosting/isDevelopment",
"qualifiedName": "isDevelopment",
- "description": "Checks if running in Development environment",
+ "description": "Checks if the environment is Development.",
+ "returns": "True if running in Development environment.",
"kind": "Method",
"signature": "isDevelopment(): boolean",
"parameters": [],
@@ -3353,13 +3324,15 @@
"name": "isEnvironment",
"capabilityId": "Aspire.Hosting/isEnvironment",
"qualifiedName": "isEnvironment",
- "description": "Checks if the environment matches the specified name",
+ "description": "Checks if the environment matches the specified name.",
+ "returns": "True if the environment matches the specified name.",
"kind": "Method",
"signature": "isEnvironment(environmentName: string): boolean",
"parameters": [
{
"name": "environmentName",
- "type": "string"
+ "type": "string",
+ "description": "The environment name to compare against."
}
],
"returnType": "boolean",
@@ -3372,7 +3345,8 @@
"name": "isProduction",
"capabilityId": "Aspire.Hosting/isProduction",
"qualifiedName": "isProduction",
- "description": "Checks if running in Production environment",
+ "description": "Checks if the environment is Production.",
+ "returns": "True if running in Production environment.",
"kind": "Method",
"signature": "isProduction(): boolean",
"parameters": [],
@@ -3386,7 +3360,8 @@
"name": "isStaging",
"capabilityId": "Aspire.Hosting/isStaging",
"qualifiedName": "isStaging",
- "description": "Checks if running in Staging environment",
+ "description": "Checks if the environment is Staging.",
+ "returns": "True if running in Staging environment.",
"kind": "Method",
"signature": "isStaging(): boolean",
"parameters": [],
@@ -3400,7 +3375,7 @@
"name": "filePath",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.filePath",
"qualifiedName": "IUserSecretsManager.filePath",
- "description": "Gets the FilePath property",
+ "description": "Gets the path to the user secrets file.",
"kind": "PropertyGetter",
"signature": "filePath(): string",
"parameters": [],
@@ -3414,7 +3389,8 @@
"name": "isAvailable",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.isAvailable",
"qualifiedName": "IUserSecretsManager.isAvailable",
- "description": "Gets the IsAvailable property",
+ "description": "Gets a value indicating whether user secrets are available.",
+ "remarks": "Returns `true` if the project has a user secrets ID configured; otherwise, `false`.",
"kind": "PropertyGetter",
"signature": "isAvailable(): boolean",
"parameters": [],
@@ -3428,13 +3404,16 @@
"name": "tryDeleteSecret",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.tryDeleteSecret",
"qualifiedName": "IUserSecretsManager.tryDeleteSecret",
- "description": "Attempts to delete a user secret value",
+ "description": "Attempts to delete a user secret value synchronously.",
+ "remarks": "The default implementation returns `false` so existing implementations remain compatible.",
+ "returns": "True if the secret was deleted successfully; otherwise, false.",
"kind": "InstanceMethod",
"signature": "tryDeleteSecret(name: string): boolean",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret."
}
],
"returnType": "boolean",
@@ -3447,17 +3426,20 @@
"name": "trySetSecret",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.trySetSecret",
"qualifiedName": "IUserSecretsManager.trySetSecret",
- "description": "Attempts to set a user secret value",
+ "description": "Attempts to set a user secret value synchronously.",
+ "returns": "True if the secret was set successfully; otherwise, false.",
"kind": "InstanceMethod",
"signature": "trySetSecret(name: string, value: string): boolean",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The value of the secret."
}
],
"returnType": "boolean",
@@ -3470,171 +3452,184 @@
"name": "List.add",
"capabilityId": "Aspire.Hosting/List.add",
"qualifiedName": "List.add",
- "description": "Adds an item to the end of a list",
+ "description": "Adds an item to the end of a list.",
"kind": "Method",
"signature": "List.add(item: any): void",
"parameters": [
{
"name": "item",
- "type": "any"
+ "type": "any",
+ "description": "The item to add."
}
],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.clear",
"capabilityId": "Aspire.Hosting/List.clear",
"qualifiedName": "List.clear",
- "description": "Clears all items from a list",
+ "description": "Clears all items from a list.",
"kind": "Method",
"signature": "List.clear(): void",
"parameters": [],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.get",
"capabilityId": "Aspire.Hosting/List.get",
"qualifiedName": "List.get",
- "description": "Gets an item from a list by index",
+ "description": "Gets an item from a list by index.",
+ "returns": "The item at the specified index.",
"kind": "Method",
"signature": "List.get(index: number): any",
"parameters": [
{
"name": "index",
- "type": "number"
+ "type": "number",
+ "description": "The zero-based index."
}
],
"returnType": "any",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.indexOf",
"capabilityId": "Aspire.Hosting/List.indexOf",
"qualifiedName": "List.indexOf",
- "description": "Gets the index of an item in a list",
+ "description": "Gets the index of an item in a list.",
+ "returns": "The zero-based index, or -1 if not found.",
"kind": "Method",
"signature": "List.indexOf(item: any): number",
"parameters": [
{
"name": "item",
- "type": "any"
+ "type": "any",
+ "description": "The item to find."
}
],
"returnType": "number",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.insert",
"capabilityId": "Aspire.Hosting/List.insert",
"qualifiedName": "List.insert",
- "description": "Inserts an item at a specific index in a list",
+ "description": "Inserts an item at a specific index in a list.",
"kind": "Method",
"signature": "List.insert(index: number, item: any): void",
"parameters": [
{
"name": "index",
- "type": "number"
+ "type": "number",
+ "description": "The zero-based index at which to insert."
},
{
"name": "item",
- "type": "any"
+ "type": "any",
+ "description": "The item to insert."
}
],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.length",
"capabilityId": "Aspire.Hosting/List.length",
"qualifiedName": "List.length",
- "description": "Gets the number of items in a list",
+ "description": "Gets the number of items in a list.",
+ "returns": "The number of items.",
"kind": "Method",
"signature": "List.length(): number",
"parameters": [],
"returnType": "number",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.removeAt",
"capabilityId": "Aspire.Hosting/List.removeAt",
"qualifiedName": "List.removeAt",
- "description": "Removes an item at a specific index from a list",
+ "description": "Removes an item at a specific index from a list.",
+ "returns": "True if the item was removed.",
"kind": "Method",
"signature": "List.removeAt(index: number): boolean",
"parameters": [
{
"name": "index",
- "type": "number"
+ "type": "number",
+ "description": "The zero-based index of the item to remove."
}
],
"returnType": "boolean",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.set",
"capabilityId": "Aspire.Hosting/List.set",
"qualifiedName": "List.set",
- "description": "Sets an item in a list at a specific index",
+ "description": "Sets an item in a list at a specific index.",
"kind": "Method",
"signature": "List.set(index: number, value: any): void",
"parameters": [
{
"name": "index",
- "type": "number"
+ "type": "number",
+ "description": "The zero-based index."
},
{
"name": "value",
- "type": "any"
+ "type": "any",
+ "description": "The value to set."
}
],
"returnType": "void",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "List.toArray",
"capabilityId": "Aspire.Hosting/List.toArray",
"qualifiedName": "List.toArray",
- "description": "Converts a list to an array",
+ "description": "Converts the list to an array (creates a copy).",
+ "returns": "An array containing all items.",
"kind": "Method",
"signature": "List.toArray(): any[]",
"parameters": [],
"returnType": "any[]",
- "targetTypeId": "Aspire.Hosting/List\u003Cany\u003E",
+ "targetTypeId": "Aspire.Hosting/List",
"expandedTargetTypes": [
- "List\u003Cany\u003E"
+ "List"
]
},
{
"name": "log",
"capabilityId": "Aspire.Hosting/log",
"qualifiedName": "log",
- "description": "Logs a message with specified level",
+ "description": "Logs a message with a specified log level.",
"kind": "Method",
"signature": "log(level: string, message: string): void",
"parameters": [
@@ -3657,7 +3652,7 @@
"name": "logDebug",
"capabilityId": "Aspire.Hosting/logDebug",
"qualifiedName": "logDebug",
- "description": "Logs a debug message",
+ "description": "Logs a debug message.",
"kind": "Method",
"signature": "logDebug(message: string): void",
"parameters": [
@@ -3676,7 +3671,7 @@
"name": "logError",
"capabilityId": "Aspire.Hosting/logError",
"qualifiedName": "logError",
- "description": "Logs an error message",
+ "description": "Logs an error message.",
"kind": "Method",
"signature": "logError(message: string): void",
"parameters": [
@@ -3695,13 +3690,14 @@
"name": "debug",
"capabilityId": "Aspire.Hosting.ApplicationModel/debug",
"qualifiedName": "LogFacade.debug",
- "description": "Writes a debug log message",
+ "description": "Writes a debug log message.",
"kind": "InstanceMethod",
"signature": "debug(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -3714,13 +3710,14 @@
"name": "error",
"capabilityId": "Aspire.Hosting.ApplicationModel/error",
"qualifiedName": "LogFacade.error",
- "description": "Writes an error log message",
+ "description": "Writes an error log message.",
"kind": "InstanceMethod",
"signature": "error(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -3733,13 +3730,14 @@
"name": "info",
"capabilityId": "Aspire.Hosting.ApplicationModel/info",
"qualifiedName": "LogFacade.info",
- "description": "Writes an informational log message",
+ "description": "Writes an informational log message.",
"kind": "InstanceMethod",
"signature": "info(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -3752,13 +3750,14 @@
"name": "warning",
"capabilityId": "Aspire.Hosting.ApplicationModel/warning",
"qualifiedName": "LogFacade.warning",
- "description": "Writes a warning log message",
+ "description": "Writes a warning log message.",
"kind": "InstanceMethod",
"signature": "warning(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -3771,7 +3770,7 @@
"name": "logInformation",
"capabilityId": "Aspire.Hosting/logInformation",
"qualifiedName": "logInformation",
- "description": "Logs an information message",
+ "description": "Logs an information message.",
"kind": "Method",
"signature": "logInformation(message: string): void",
"parameters": [
@@ -3790,7 +3789,7 @@
"name": "logStep",
"capabilityId": "Aspire.Hosting/logStep",
"qualifiedName": "logStep",
- "description": "Logs a plain-text message for the reporting step",
+ "description": "Logs a plain-text message for the reporting step.",
"kind": "Method",
"signature": "logStep(level: string, message: string): void",
"parameters": [
@@ -3813,7 +3812,7 @@
"name": "logStepMarkdown",
"capabilityId": "Aspire.Hosting/logStepMarkdown",
"qualifiedName": "logStepMarkdown",
- "description": "Logs a Markdown-formatted message for the reporting step",
+ "description": "Logs a Markdown-formatted message for the reporting step.",
"kind": "Method",
"signature": "logStepMarkdown(level: string, markdownString: string): void",
"parameters": [
@@ -3836,7 +3835,7 @@
"name": "logWarning",
"capabilityId": "Aspire.Hosting/logWarning",
"qualifiedName": "logWarning",
- "description": "Logs a warning message",
+ "description": "Logs a warning message.",
"kind": "Method",
"signature": "logWarning(message: string): void",
"parameters": [
@@ -3855,15 +3854,17 @@
"name": "onAfterResourcesCreated",
"capabilityId": "Aspire.Hosting/eventingSubscriberOnAfterResourcesCreated",
"qualifiedName": "onAfterResourcesCreated",
- "description": "Subscribes an eventing subscriber to the AfterResourcesCreated event",
+ "description": "Subscribes to the AfterResourcesCreated event from an eventing subscriber registration context.",
+ "returns": "The event subscription.",
"kind": "Method",
- "signature": "onAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "onAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: AfterResourcesCreatedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -3876,15 +3877,17 @@
"name": "onBeforeResourceStarted",
"capabilityId": "Aspire.Hosting/onBeforeResourceStarted",
"qualifiedName": "onBeforeResourceStarted",
- "description": "Subscribes to the BeforeResourceStarted event",
+ "description": "Subscribes to the BeforeResourceStarted event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onBeforeResourceStarted(callback: (arg: BeforeResourceStartedEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onBeforeResourceStarted(callback: (arg: BeforeResourceStartedEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeResourceStartedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeResourceStartedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -3905,15 +3908,17 @@
"name": "onBeforeStart",
"capabilityId": "Aspire.Hosting/eventingSubscriberOnBeforeStart",
"qualifiedName": "onBeforeStart",
- "description": "Subscribes an eventing subscriber to the BeforeStart event",
+ "description": "Subscribes to the BeforeStart event from an eventing subscriber registration context.",
+ "returns": "The event subscription.",
"kind": "Method",
- "signature": "onBeforeStart(callback: (arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "onBeforeStart(callback: (arg: BeforeStartEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeStartEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -3926,15 +3931,17 @@
"name": "onConnectionStringAvailable",
"capabilityId": "Aspire.Hosting/onConnectionStringAvailable",
"qualifiedName": "onConnectionStringAvailable",
- "description": "Subscribes to the ConnectionStringAvailable event",
+ "description": "Subscribes to the ConnectionStringAvailable event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onConnectionStringAvailable(callback: (arg: ConnectionStringAvailableEvent) =\u003E Promise\u003Cvoid\u003E): IResourceWithConnectionString",
+ "signature": "onConnectionStringAvailable(callback: (arg: ConnectionStringAvailableEvent) => Promise): IResourceWithConnectionString",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ConnectionStringAvailableEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ConnectionStringAvailableEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResourceWithConnectionString",
@@ -3948,15 +3955,17 @@
"name": "onInitializeResource",
"capabilityId": "Aspire.Hosting/onInitializeResource",
"qualifiedName": "onInitializeResource",
- "description": "Subscribes to the InitializeResource event",
+ "description": "Subscribes to the InitializeResource event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onInitializeResource(callback: (arg: InitializeResourceEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onInitializeResource(callback: (arg: InitializeResourceEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: InitializeResourceEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: InitializeResourceEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -3977,15 +3986,17 @@
"name": "onResourceEndpointsAllocated",
"capabilityId": "Aspire.Hosting/onResourceEndpointsAllocated",
"qualifiedName": "onResourceEndpointsAllocated",
- "description": "Subscribes to the ResourceEndpointsAllocated event",
+ "description": "Subscribes to the ResourceEndpointsAllocated event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceEndpointsAllocated(callback: (arg: ResourceEndpointsAllocatedEvent) =\u003E Promise\u003Cvoid\u003E): IResourceWithEndpoints",
+ "signature": "onResourceEndpointsAllocated(callback: (arg: ResourceEndpointsAllocatedEvent) => Promise): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceEndpointsAllocatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceEndpointsAllocatedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResourceWithEndpoints",
@@ -4003,15 +4014,17 @@
"name": "onResourceReady",
"capabilityId": "Aspire.Hosting/onResourceReady",
"qualifiedName": "onResourceReady",
- "description": "Subscribes to the ResourceReady event",
+ "description": "Subscribes to the ResourceReady event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceReady(callback: (arg: ResourceReadyEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onResourceReady(callback: (arg: ResourceReadyEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceReadyEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceReadyEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -4032,15 +4045,17 @@
"name": "onResourceStopped",
"capabilityId": "Aspire.Hosting/onResourceStopped",
"qualifiedName": "onResourceStopped",
- "description": "Subscribes to the ResourceStopped event",
+ "description": "Subscribes to the ResourceStopped event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceStopped(callback: (arg: ResourceStoppedEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onResourceStopped(callback: (arg: ResourceStoppedEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceStoppedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceStoppedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -4061,13 +4076,15 @@
"name": "getSteps",
"capabilityId": "Aspire.Hosting.Pipelines/getSteps",
"qualifiedName": "PipelineConfigurationContext.getSteps",
- "description": "Gets pipeline steps with the specified tag",
+ "description": "Gets all pipeline steps with the specified tag.",
+ "returns": "A collection of steps that have the specified tag.",
"kind": "InstanceMethod",
"signature": "getSteps(tag: string): PipelineStep[]",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to search for."
}
],
"returnType": "PipelineStep[]",
@@ -4080,7 +4097,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineConfigurationContext.log",
"qualifiedName": "PipelineConfigurationContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -4094,7 +4111,7 @@
"name": "pipeline",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineConfigurationContext.pipeline",
"qualifiedName": "PipelineConfigurationContext.pipeline",
- "description": "Gets the pipeline editor",
+ "description": "Gets the pipeline editor used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "pipeline(): PipelineEditor",
"parameters": [],
@@ -4108,7 +4125,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.cancellationToken",
"qualifiedName": "PipelineContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -4122,7 +4139,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.executionContext",
"qualifiedName": "PipelineContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Gets the execution context for the distributed application.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -4136,7 +4153,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.logger",
"qualifiedName": "PipelineContext.logger",
- "description": "Gets the Logger property",
+ "description": "Gets the logger for pipeline operations.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -4150,7 +4167,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.model",
"qualifiedName": "PipelineContext.model",
- "description": "Gets the Model property",
+ "description": "Gets the distributed application model to be deployed.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -4164,7 +4181,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.services",
"qualifiedName": "PipelineContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency resolution.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -4178,7 +4195,7 @@
"name": "setCancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.setCancellationToken",
"qualifiedName": "PipelineContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertySetter",
"signature": "setCancellationToken(value: cancellationToken): PipelineContext",
"parameters": [
@@ -4197,7 +4214,8 @@
"name": "summary",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.summary",
"qualifiedName": "PipelineContext.summary",
- "description": "Gets the Summary property",
+ "description": "Gets the pipeline summary that steps can add information to. The summary will be displayed to users after pipeline execution completes.",
+ "remarks": "Pipeline steps can add key-value pairs to the summary to provide useful information\nabout the pipeline execution, such as deployment targets, resource names, URLs, etc.",
"kind": "PropertyGetter",
"signature": "summary(): PipelineSummary",
"parameters": [],
@@ -4211,7 +4229,8 @@
"name": "steps",
"capabilityId": "Aspire.Hosting.Pipelines/steps",
"qualifiedName": "PipelineEditor.steps",
- "description": "Gets all configured pipeline steps",
+ "description": "Gets all configured pipeline steps.",
+ "returns": "The configured pipeline steps.",
"kind": "InstanceMethod",
"signature": "steps(): PipelineStep[]",
"parameters": [],
@@ -4225,13 +4244,15 @@
"name": "stepsByTag",
"capabilityId": "Aspire.Hosting.Pipelines/stepsByTag",
"qualifiedName": "PipelineEditor.stepsByTag",
- "description": "Gets pipeline steps with the specified tag",
+ "description": "Gets all pipeline steps that have the specified tag.",
+ "returns": "The matching pipeline steps.",
"kind": "InstanceMethod",
"signature": "stepsByTag(tag: string): PipelineStep[]",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to search for."
}
],
"returnType": "PipelineStep[]",
@@ -4244,13 +4265,14 @@
"name": "addTag",
"capabilityId": "Aspire.Hosting.Pipelines/addTag",
"qualifiedName": "PipelineStep.addTag",
- "description": "Adds a tag to the step",
+ "description": "Adds a tag to the step.",
"kind": "InstanceMethod",
"signature": "addTag(tag: string): void",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to add."
}
],
"returnType": "void",
@@ -4263,13 +4285,14 @@
"name": "dependsOn",
"capabilityId": "Aspire.Hosting.Pipelines/dependsOn",
"qualifiedName": "PipelineStep.dependsOn",
- "description": "Adds a dependency on another step by name",
+ "description": "Adds a dependency on another step.",
"kind": "InstanceMethod",
"signature": "dependsOn(stepName: string): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the step to depend on."
}
],
"returnType": "void",
@@ -4282,7 +4305,8 @@
"name": "description",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStep.description",
"qualifiedName": "PipelineStep.description",
- "description": "Gets the human-readable description of the step",
+ "description": "Gets the exported description projection for polyglot SDKs.",
+ "remarks": "This projection avoids exporting an ATS setter for the public init-only `Description` property.",
"kind": "PropertyGetter",
"signature": "description(): string",
"parameters": [],
@@ -4296,7 +4320,8 @@
"name": "name",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStep.name",
"qualifiedName": "PipelineStep.name",
- "description": "Gets the unique name of the step",
+ "description": "Gets the exported name projection for polyglot SDKs.",
+ "remarks": "This projection avoids exporting an ATS setter for the public init-only `Name` property.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -4310,13 +4335,14 @@
"name": "requiredBy",
"capabilityId": "Aspire.Hosting.Pipelines/requiredBy",
"qualifiedName": "PipelineStep.requiredBy",
- "description": "Specifies that another step requires this step by name",
+ "description": "Specifies that this step is required by another step. This creates the inverse relationship where the other step will depend on this step.",
"kind": "InstanceMethod",
"signature": "requiredBy(stepName: string): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the step that requires this step."
}
],
"returnType": "void",
@@ -4329,7 +4355,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.cancellationToken",
"qualifiedName": "PipelineStepContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -4343,7 +4369,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.executionContext",
"qualifiedName": "PipelineStepContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Gets the execution context for the distributed application.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -4357,7 +4383,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.logger",
"qualifiedName": "PipelineStepContext.logger",
- "description": "Gets the Logger property",
+ "description": "Gets the logger for pipeline operations that writes to both the pipeline logger and the step logger.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -4371,7 +4397,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.model",
"qualifiedName": "PipelineStepContext.model",
- "description": "Gets the Model property",
+ "description": "Gets the distributed application model to be deployed.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -4385,7 +4411,7 @@
"name": "pipelineContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.pipelineContext",
"qualifiedName": "PipelineStepContext.pipelineContext",
- "description": "Gets the PipelineContext property",
+ "description": "Gets the pipeline context shared across all steps.",
"kind": "PropertyGetter",
"signature": "pipelineContext(): PipelineContext",
"parameters": [],
@@ -4399,7 +4425,7 @@
"name": "reportingStep",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.reportingStep",
"qualifiedName": "PipelineStepContext.reportingStep",
- "description": "Gets the ReportingStep property",
+ "description": "Gets the publishing step associated with this specific step execution.",
"kind": "PropertyGetter",
"signature": "reportingStep(): IReportingStep",
"parameters": [],
@@ -4413,7 +4439,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.services",
"qualifiedName": "PipelineStepContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency resolution.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -4423,49 +4449,12 @@
"Aspire.Hosting.Pipelines.PipelineStepContext"
]
},
- {
- "name": "setPipelineContext",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.setPipelineContext",
- "qualifiedName": "PipelineStepContext.setPipelineContext",
- "description": "Sets the PipelineContext property",
- "kind": "PropertySetter",
- "signature": "setPipelineContext(value: PipelineContext): PipelineStepContext",
- "parameters": [
- {
- "name": "value",
- "type": "PipelineContext"
- }
- ],
- "returnType": "PipelineStepContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepContext"
- ]
- },
- {
- "name": "setReportingStep",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.setReportingStep",
- "qualifiedName": "PipelineStepContext.setReportingStep",
- "description": "Sets the ReportingStep property",
- "kind": "PropertySetter",
- "signature": "setReportingStep(value: IReportingStep): PipelineStepContext",
- "parameters": [
- {
- "name": "value",
- "type": "IReportingStep"
- }
- ],
- "returnType": "PipelineStepContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepContext"
- ]
- },
{
"name": "summary",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.summary",
"qualifiedName": "PipelineStepContext.summary",
- "description": "Gets the Summary property",
+ "description": "Gets the pipeline summary that steps can add information to. The summary will be displayed to users after pipeline execution completes.",
+ "remarks": "Pipeline steps can add key-value pairs to the summary to provide useful information\nabout the pipeline execution, such as deployment targets, resource names, URLs, etc.",
"kind": "PropertyGetter",
"signature": "summary(): PipelineSummary",
"parameters": [],
@@ -4479,7 +4468,7 @@
"name": "pipelineContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.pipelineContext",
"qualifiedName": "PipelineStepFactoryContext.pipelineContext",
- "description": "Gets the PipelineContext property",
+ "description": "Gets the pipeline context that has the model and other properties.",
"kind": "PropertyGetter",
"signature": "pipelineContext(): PipelineContext",
"parameters": [],
@@ -4493,7 +4482,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.resource",
"qualifiedName": "PipelineStepFactoryContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource that this factory is associated with.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -4503,59 +4492,23 @@
"Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
]
},
- {
- "name": "setPipelineContext",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setPipelineContext",
- "qualifiedName": "PipelineStepFactoryContext.setPipelineContext",
- "description": "Sets the PipelineContext property",
- "kind": "PropertySetter",
- "signature": "setPipelineContext(value: PipelineContext): PipelineStepFactoryContext",
- "parameters": [
- {
- "name": "value",
- "type": "PipelineContext"
- }
- ],
- "returnType": "PipelineStepFactoryContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
- ]
- },
- {
- "name": "setResource",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setResource",
- "qualifiedName": "PipelineStepFactoryContext.setResource",
- "description": "Sets the Resource property",
- "kind": "PropertySetter",
- "signature": "setResource(value: IResource): PipelineStepFactoryContext",
- "parameters": [
- {
- "name": "value",
- "type": "IResource"
- }
- ],
- "returnType": "PipelineStepFactoryContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
- ]
- },
{
"name": "add",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineSummary.add",
"qualifiedName": "PipelineSummary.add",
- "description": "Invokes the Add method",
+ "description": "Adds a key-value pair to the pipeline summary with a plain-text value.",
"kind": "InstanceMethod",
"signature": "add(key: string, value: string): void",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key or label for the item (e.g., \"Namespace\", \"URL\")."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The plain-text value for the item."
}
],
"returnType": "void",
@@ -4568,7 +4521,7 @@
"name": "excludeKestrelEndpoints",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.excludeKestrelEndpoints",
"qualifiedName": "ProjectResourceOptions.excludeKestrelEndpoints",
- "description": "Gets the ExcludeKestrelEndpoints property",
+ "description": "If set, ignore endpoints coming from Kestrel configuration.",
"kind": "PropertyGetter",
"signature": "excludeKestrelEndpoints(): boolean",
"parameters": [],
@@ -4582,7 +4535,7 @@
"name": "excludeLaunchProfile",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.excludeLaunchProfile",
"qualifiedName": "ProjectResourceOptions.excludeLaunchProfile",
- "description": "Gets the ExcludeLaunchProfile property",
+ "description": "If set, no launch profile will be used, and LaunchProfileName will be ignored.",
"kind": "PropertyGetter",
"signature": "excludeLaunchProfile(): boolean",
"parameters": [],
@@ -4596,7 +4549,7 @@
"name": "launchProfileName",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.launchProfileName",
"qualifiedName": "ProjectResourceOptions.launchProfileName",
- "description": "Gets the LaunchProfileName property",
+ "description": "The launch profile to use. If `null` then the default launch profile will be used.",
"kind": "PropertyGetter",
"signature": "launchProfileName(): string",
"parameters": [],
@@ -4610,7 +4563,7 @@
"name": "setExcludeKestrelEndpoints",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setExcludeKestrelEndpoints",
"qualifiedName": "ProjectResourceOptions.setExcludeKestrelEndpoints",
- "description": "Sets the ExcludeKestrelEndpoints property",
+ "description": "If set, ignore endpoints coming from Kestrel configuration.",
"kind": "PropertySetter",
"signature": "setExcludeKestrelEndpoints(value: boolean): ProjectResourceOptions",
"parameters": [
@@ -4629,7 +4582,7 @@
"name": "setExcludeLaunchProfile",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setExcludeLaunchProfile",
"qualifiedName": "ProjectResourceOptions.setExcludeLaunchProfile",
- "description": "Sets the ExcludeLaunchProfile property",
+ "description": "If set, no launch profile will be used, and LaunchProfileName will be ignored.",
"kind": "PropertySetter",
"signature": "setExcludeLaunchProfile(value: boolean): ProjectResourceOptions",
"parameters": [
@@ -4648,7 +4601,7 @@
"name": "setLaunchProfileName",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setLaunchProfileName",
"qualifiedName": "ProjectResourceOptions.setLaunchProfileName",
- "description": "Sets the LaunchProfileName property",
+ "description": "The launch profile to use. If `null` then the default launch profile will be used.",
"kind": "PropertySetter",
"signature": "setLaunchProfileName(value: string): ProjectResourceOptions",
"parameters": [
@@ -4667,7 +4620,8 @@
"name": "publishAsConnectionString",
"capabilityId": "Aspire.Hosting/publishAsConnectionString",
"qualifiedName": "publishAsConnectionString",
- "description": "Publishes the resource as a connection string",
+ "description": "Changes the resource to be published as a connection string reference in the manifest.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsConnectionString(): ContainerResource",
"parameters": [],
@@ -4682,7 +4636,8 @@
"name": "publishAsContainer",
"capabilityId": "Aspire.Hosting/publishAsContainer",
"qualifiedName": "publishAsContainer",
- "description": "Configures the resource to be published as a container",
+ "description": "Changes the resource to be published as a container in the manifest.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsContainer(): ContainerResource",
"parameters": [],
@@ -4697,15 +4652,18 @@
"name": "publishAsDockerFile",
"capabilityId": "Aspire.Hosting/publishAsDockerFile",
"qualifiedName": "publishAsDockerFile",
- "description": "Publishes an executable as a Docker file",
+ "description": "Adds support for containerizing this `ExecutableResource` during deployment. The resulting container image is built, and when the optional `configure` action is provided, it is used to configure the container resource.",
+ "remarks": "When the executable resource is converted to a container resource, the arguments to the executable\nare not used. This is because arguments to the executable often contain physical paths that are not valid\nin the container. The container can be set up with the correct arguments using the `configure` action.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "publishAsDockerFile(configure: (obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E): ExecutableResource",
+ "signature": "publishAsDockerFile(configure: (obj: ContainerResource) => Promise): ExecutableResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ContainerResource) => Promise",
+ "description": "Optional action to configure the container resource"
}
],
"returnType": "ExecutableResource",
@@ -4720,16 +4678,19 @@
"name": "publishAsDockerFile",
"capabilityId": "Aspire.Hosting/publishProjectAsDockerFileWithConfigure",
"qualifiedName": "publishAsDockerFile",
- "description": "Publishes a project as a Docker file with optional container configuration",
+ "description": "Adds support for containerizing this `ProjectResource` during deployment. The resulting container image is built, and when the optional `configure` action is provided, it is used to configure the container resource.",
+ "remarks": "When the executable resource is converted to a container resource, the arguments to the executable\nare not used. This is because arguments to the project often contain physical paths that are not valid\nin the container. The container can be set up with the correct arguments using the `configure` action.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "publishAsDockerFile(configure?: (obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E): ProjectResource",
+ "signature": "publishAsDockerFile(configure?: (obj: ContainerResource) => Promise): ProjectResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ContainerResource) => Promise",
+ "description": "Optional action to configure the container resource"
}
],
"returnType": "ProjectResource",
@@ -4744,7 +4705,7 @@
"name": "publishResourceUpdate",
"capabilityId": "Aspire.Hosting/publishResourceUpdate",
"qualifiedName": "publishResourceUpdate",
- "description": "Publishes an update for a resource\u0027s state",
+ "description": "Publishes an update for a resource's state.",
"kind": "Method",
"signature": "publishResourceUpdate(resource: IResource, state?: string, stateStyle?: string): void",
"parameters": [
@@ -4773,17 +4734,19 @@
"name": "publishWithContainerFiles",
"capabilityId": "Aspire.Hosting/publishWithContainerFilesFromResource",
"qualifiedName": "publishWithContainerFiles",
- "description": "Configures the resource to copy container files from the specified source during publishing",
+ "description": "Configures the resource to copy container files from the specified source resource during publishing.",
"kind": "Method",
"signature": "publishWithContainerFiles(source: IResourceWithContainerFiles, destinationPath: string): IContainerFilesDestinationResource",
"parameters": [
{
"name": "source",
- "type": "IResourceWithContainerFiles"
+ "type": "IResourceWithContainerFiles",
+ "description": "The resource which contains the container files to be copied."
},
{
"name": "destinationPath",
- "type": "string"
+ "type": "string",
+ "description": "The destination path within the resource's container where the files will be copied."
}
],
"returnType": "IContainerFilesDestinationResource",
@@ -4798,13 +4761,14 @@
"name": "getValueAsync",
"capabilityId": "Aspire.Hosting.ApplicationModel/getValueAsync",
"qualifiedName": "ReferenceExpression.getValueAsync",
- "description": "Gets the resolved string value of the reference expression asynchronously",
+ "description": "Gets the value of the expression. The final string value after evaluating the format string and its parameters.",
"kind": "InstanceMethod",
"signature": "getValueAsync(cancellationToken: cancellationToken): string",
"parameters": [
{
"name": "cancellationToken",
- "type": "cancellationToken"
+ "type": "cancellationToken",
+ "description": "A `CancellationToken`."
}
],
"returnType": "string",
@@ -4817,18 +4781,20 @@
"name": "appendFormatted",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendFormatted",
"qualifiedName": "ReferenceExpressionBuilder.appendFormatted",
- "description": "Appends a formatted string value to the reference expression",
+ "description": "Appends a formatted value to the expression.",
"kind": "InstanceMethod",
"signature": "appendFormatted(value: string, format?: string): void",
"parameters": [
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The formatted string to be appended to the interpolated string."
},
{
"name": "format",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The format to be applied to the value. e.g., \"uri\""
}
],
"returnType": "void",
@@ -4841,13 +4807,14 @@
"name": "appendLiteral",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendLiteral",
"qualifiedName": "ReferenceExpressionBuilder.appendLiteral",
- "description": "Appends a literal string to the reference expression",
+ "description": "Appends a literal value to the expression.",
"kind": "InstanceMethod",
"signature": "appendLiteral(value: string): void",
"parameters": [
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The literal string value to be appended to the interpolated string."
}
],
"returnType": "void",
@@ -4860,18 +4827,20 @@
"name": "appendValueProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendValueProvider",
"qualifiedName": "ReferenceExpressionBuilder.appendValueProvider",
- "description": "Appends a value provider to the reference expression",
+ "description": "Appends a value provider to the expression using late binding. The object must implement both `IValueProvider` and `IManifestExpressionProvider`, or be an `IResourceBuilder`1` where T implements both interfaces.",
"kind": "InstanceMethod",
"signature": "appendValueProvider(valueProvider: any, format?: string): void",
"parameters": [
{
"name": "valueProvider",
- "type": "any"
+ "type": "any",
+ "description": "An object that implements both interfaces, or an IResourceBuilder wrapping such an object."
},
{
"name": "format",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional format specifier."
}
],
"returnType": "void",
@@ -4884,7 +4853,7 @@
"name": "build",
"capabilityId": "Aspire.Hosting.ApplicationModel/build",
"qualifiedName": "ReferenceExpressionBuilder.build",
- "description": "Builds the reference expression",
+ "description": "Builds the `ReferenceExpression`.",
"kind": "InstanceMethod",
"signature": "build(): ReferenceExpression",
"parameters": [],
@@ -4898,7 +4867,7 @@
"name": "isEmpty",
"capabilityId": "Aspire.Hosting.ApplicationModel/ReferenceExpressionBuilder.isEmpty",
"qualifiedName": "ReferenceExpressionBuilder.isEmpty",
- "description": "Gets the IsEmpty property",
+ "description": "Indicates whether the expression is empty.",
"kind": "PropertyGetter",
"signature": "isEmpty(): boolean",
"parameters": [],
@@ -4940,7 +4909,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceReadyEvent.resource",
"qualifiedName": "ResourceReadyEvent.resource",
- "description": "Gets the Resource property",
+ "description": "The resource that is in a healthy state.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -4996,7 +4965,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.executionContext",
"qualifiedName": "ResourceUrlsCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this invocation of the AppHost.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -5010,13 +4979,14 @@
"name": "getEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/getEndpoint",
"qualifiedName": "ResourceUrlsCallbackContext.getEndpoint",
- "description": "Gets an endpoint reference from the associated resource",
+ "description": "Gets an endpoint reference from `Resource` for the specified endpoint name. If `Resource` does not implement `IResourceWithEndpoints` then returns `null`.",
"kind": "InstanceMethod",
"signature": "getEndpoint(name: string): EndpointReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint."
}
],
"returnType": "EndpointReference",
@@ -5029,7 +4999,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.log",
"qualifiedName": "ResourceUrlsCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -5043,7 +5013,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.resource",
"qualifiedName": "ResourceUrlsCallbackContext.resource",
- "description": "Gets the resource associated with these URLs",
+ "description": "Gets the resource this the URLs are associated with.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -5057,7 +5027,7 @@
"name": "urls",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.urls",
"qualifiedName": "ResourceUrlsCallbackContext.urls",
- "description": "Gets the URL editor",
+ "description": "Gets the editor used to manipulate displayed URLs in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "urls(): ResourceUrlsEditor",
"parameters": [],
@@ -5071,18 +5041,20 @@
"name": "add",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.add",
"qualifiedName": "ResourceUrlsEditor.add",
- "description": "Adds a displayed URL",
+ "description": "Adds a displayed URL.",
"kind": "InstanceMethod",
"signature": "add(url: ReferenceExpression, displayText?: string): void",
"parameters": [
{
"name": "url",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The URL to add, specified as a string or reference expression."
},
{
"name": "displayText",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The optional display text to show for the URL."
}
],
"returnType": "void",
@@ -5095,22 +5067,25 @@
"name": "addForEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.addForEndpoint",
"qualifiedName": "ResourceUrlsEditor.addForEndpoint",
- "description": "Adds a displayed URL for a specific endpoint",
+ "description": "Adds a displayed URL for a specific endpoint.",
"kind": "InstanceMethod",
"signature": "addForEndpoint(endpoint: EndpointReference, url: ReferenceExpression, displayText?: string): void",
"parameters": [
{
"name": "endpoint",
- "type": "EndpointReference"
+ "type": "EndpointReference",
+ "description": "The endpoint the URL is associated with."
},
{
"name": "url",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The URL to add, specified as a string or reference expression."
},
{
"name": "displayText",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The optional display text to show for the URL."
}
],
"returnType": "void",
@@ -5123,7 +5098,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.executionContext",
"qualifiedName": "ResourceUrlsEditor.executionContext",
- "description": "Gets the execution context for this URL editor",
+ "description": "Gets the execution context associated with this editor.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -5179,18 +5154,21 @@
"name": "saveStateJson",
"capabilityId": "Aspire.Hosting/saveStateJson",
"qualifiedName": "saveStateJson",
- "description": "Saves state to user secrets from a JSON string",
+ "description": "Saves state to user secrets from a JSON string.",
+ "returns": "A task that completes when the state is saved.",
"kind": "Method",
"signature": "saveStateJson(json: string, cancellationToken?: cancellationToken): void",
"parameters": [
{
"name": "json",
- "type": "string"
+ "type": "string",
+ "description": "The JSON object payload to persist."
},
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The cancellation token."
}
],
"returnType": "void",
@@ -5203,15 +5181,18 @@
"name": "subscribeAfterResourcesCreated",
"capabilityId": "Aspire.Hosting/subscribeAfterResourcesCreated",
"qualifiedName": "subscribeAfterResourcesCreated",
- "description": "Subscribes to the AfterResourcesCreated event",
+ "description": "Subscribes to the AfterResourcesCreated event, which fires after all resources are created.",
+ "remarks": "At this point, all resources have been instantiated but may not yet be running.\nThis is useful for performing cross-resource configuration.",
+ "returns": "A subscription handle that can be used to unsubscribe.",
"kind": "Method",
- "signature": "subscribeAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "subscribeAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: AfterResourcesCreatedEvent) => Promise",
+ "description": "A callback that receives the exported event when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -5224,15 +5205,18 @@
"name": "subscribeBeforeStart",
"capabilityId": "Aspire.Hosting/subscribeBeforeStart",
"qualifiedName": "subscribeBeforeStart",
- "description": "Subscribes to the BeforeStart event",
+ "description": "Subscribes to the BeforeStart event, which fires before the application starts.",
+ "remarks": "This event provides access to the service provider and distributed application model,\nallowing you to perform final configuration or validation before resources start.",
+ "returns": "A subscription handle that can be used to unsubscribe.",
"kind": "Method",
- "signature": "subscribeBeforeStart(callback: (arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "subscribeBeforeStart(callback: (arg: BeforeStartEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeStartEvent) => Promise",
+ "description": "A callback that receives the exported event when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -5245,15 +5229,16 @@
"name": "tryAddEventingSubscriber",
"capabilityId": "Aspire.Hosting/tryAddEventingSubscriber",
"qualifiedName": "tryAddEventingSubscriber",
- "description": "Attempts to add an eventing subscriber",
+ "description": "Attempts to add an ATS-friendly eventing subscriber callback to the distributed-application builder.",
"kind": "Method",
- "signature": "tryAddEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "tryAddEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) => Promise): void",
"parameters": [
{
"name": "subscribe",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EventingSubscriberRegistrationContext) => Promise",
+ "description": "The callback that registers the event subscriptions."
}
],
"returnType": "void",
@@ -5266,7 +5251,7 @@
"name": "tryGetResourceState",
"capabilityId": "Aspire.Hosting/tryGetResourceState",
"qualifiedName": "tryGetResourceState",
- "description": "Tries to get the current state of a resource",
+ "description": "Tries to get the current state of a resource.",
"kind": "Method",
"signature": "tryGetResourceState(resourceName: string): ResourceEventDto",
"parameters": [
@@ -5285,7 +5270,7 @@
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.serviceProvider",
"qualifiedName": "UpdateCommandStateContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The service provider.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -5295,30 +5280,11 @@
"Aspire.Hosting.ApplicationModel.UpdateCommandStateContext"
]
},
- {
- "name": "setServiceProvider",
- "capabilityId": "Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.setServiceProvider",
- "qualifiedName": "UpdateCommandStateContext.setServiceProvider",
- "description": "Sets the ServiceProvider property",
- "kind": "PropertySetter",
- "signature": "setServiceProvider(value: IServiceProvider): UpdateCommandStateContext",
- "parameters": [
- {
- "name": "value",
- "type": "IServiceProvider"
- }
- ],
- "returnType": "UpdateCommandStateContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.UpdateCommandStateContext"
- ]
- },
{
"name": "updateTask",
"capabilityId": "Aspire.Hosting/updateTask",
"qualifiedName": "updateTask",
- "description": "Updates the reporting task with plain-text status text",
+ "description": "Updates the reporting task with plain-text status text.",
"kind": "Method",
"signature": "updateTask(statusText: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -5342,7 +5308,7 @@
"name": "updateTaskMarkdown",
"capabilityId": "Aspire.Hosting/updateTaskMarkdown",
"qualifiedName": "updateTaskMarkdown",
- "description": "Updates the reporting task with Markdown-formatted status text",
+ "description": "Updates the reporting task with Markdown-formatted status text.",
"kind": "Method",
"signature": "updateTaskMarkdown(markdownString: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -5415,19 +5381,23 @@
"name": "waitForCompletion",
"capabilityId": "Aspire.Hosting/waitForResourceCompletion",
"qualifiedName": "waitForCompletion",
- "description": "Waits for resource completion",
+ "description": "Waits for the dependency resource to enter the Exited or Finished state before starting the resource.",
+ "remarks": "This method is useful when a resource should wait until another has completed. A common usage pattern\nwould be to include a console application that initializes the database schema or performs other one off\ninitialization tasks.\nNote that this method has no impact at deployment time and only works for local development.\nWait for database initialization app to complete running.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar pgsql = builder.AddPostgres(\"postgres\");\nvar dbprep = builder.AddProject(\"dbprep\")\n.WithReference(pgsql);\nbuilder.AddProject(\"dbpreptool\")\n.WithReference(pgsql)\n.WaitForCompletion(dbprep);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "waitForCompletion(dependency: IResource, exitCode?: number): IResourceWithWaitSupport",
"parameters": [
{
"name": "dependency",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The resource builder for the dependency resource."
},
{
"name": "exitCode",
"type": "number",
"isOptional": true,
- "defaultValue": "0"
+ "defaultValue": "0",
+ "description": "The exit code which is interpreted as successful."
}
],
"returnType": "IResourceWithWaitSupport",
@@ -5445,7 +5415,7 @@
"name": "waitForDependencies",
"capabilityId": "Aspire.Hosting/waitForDependencies",
"qualifiedName": "waitForDependencies",
- "description": "Waits for all dependencies of a resource to be ready",
+ "description": "Waits for all dependencies of a resource to be ready.",
"kind": "Method",
"signature": "waitForDependencies(resource: IResource): void",
"parameters": [
@@ -5464,7 +5434,7 @@
"name": "waitForResourceHealthy",
"capabilityId": "Aspire.Hosting/waitForResourceHealthy",
"qualifiedName": "waitForResourceHealthy",
- "description": "Waits for a resource to become healthy",
+ "description": "Waits for a resource to become healthy.",
"kind": "Method",
"signature": "waitForResourceHealthy(resourceName: string): ResourceEventDto",
"parameters": [
@@ -5483,7 +5453,7 @@
"name": "waitForResourceState",
"capabilityId": "Aspire.Hosting/waitForResourceState",
"qualifiedName": "waitForResourceState",
- "description": "Waits for a resource to reach a specified state",
+ "description": "Waits for a resource to reach a specified state.",
"kind": "Method",
"signature": "waitForResourceState(resourceName: string, targetState?: string): void",
"parameters": [
@@ -5507,7 +5477,7 @@
"name": "waitForResourceStates",
"capabilityId": "Aspire.Hosting/waitForResourceStates",
"qualifiedName": "waitForResourceStates",
- "description": "Waits for a resource to reach one of the specified states",
+ "description": "Waits for a resource to reach one of the specified states.",
"kind": "Method",
"signature": "waitForResourceStates(resourceName: string, targetStates: string[]): string",
"parameters": [
@@ -5560,13 +5530,15 @@
"name": "withArgs",
"capabilityId": "Aspire.Hosting/withArgs",
"qualifiedName": "withArgs",
- "description": "Adds arguments",
+ "description": "Adds arguments to be passed to a resource that supports arguments when it is launched.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withArgs(args: string[]): IResourceWithArgs",
"parameters": [
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to be passed to the resource when it is started."
}
],
"returnType": "IResourceWithArgs",
@@ -5584,15 +5556,17 @@
"name": "withArgsCallback",
"capabilityId": "Aspire.Hosting/withArgsCallback",
"qualifiedName": "withArgsCallback",
- "description": "Sets command-line arguments via callback",
+ "description": "Adds a callback to be executed with a list of command-line arguments when a resource is started.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withArgsCallback(callback: (obj: CommandLineArgsCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResourceWithArgs",
+ "signature": "withArgsCallback(callback: (obj: CommandLineArgsCallbackContext) => Promise): IResourceWithArgs",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: CommandLineArgsCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: CommandLineArgsCallbackContext) => Promise",
+ "description": "A callback that allows for deferred execution for computing arguments. This runs after resources have been allocated by the orchestrator and allows access to other resources to resolve computed data, e.g. connection strings, ports."
}
],
"returnType": "IResourceWithArgs",
@@ -5610,7 +5584,8 @@
"name": "withArgumentsConfig",
"capabilityId": "Aspire.Hosting/withArgumentsConfig",
"qualifiedName": "withArgumentsConfig",
- "description": "Adds an arguments configuration gatherer",
+ "description": "Adds a command line arguments configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
"signature": "withArgumentsConfig(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -5624,23 +5599,28 @@
"name": "withBindMount",
"capabilityId": "Aspire.Hosting/withBindMount",
"qualifiedName": "withBindMount",
- "description": "Adds a bind mount",
+ "description": "Adds a bind mount to a container resource.",
+ "remarks": "Bind mounts are used to mount files or directories from the host file-system into the container. If the host doesn't require access to the files, consider\nusing volumes instead via `WithVolume``1`.\nThe `source` path specifies the path of the file or directory on the host that will be mounted in the container. If the path is not absolute,\nit will be evaluated relative to the app host project directory path.\nThe `target` path specifies the path the file or directory will be mounted inside the container's file system.\nAdds a bind mount that will mount the `config` directory in the app host project directory, to the container's file system at the path `/database/config`,\nand mark it read-only so that the container cannot modify it:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithBindMount(\"./config\", \"/database/config\", isReadOnly: true);\nbuilder.Build().Run();\n```\nAdds a bind mount that will mount the `init.sh` file from a directory outside the app host project directory, to the container's file system at the path `/usr/config/initialize.sh`,\nand mark it read-only so that the container cannot modify it:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithBindMount(\"../containerconfig/scripts/init.sh\", \"/usr/config/initialize.sh\", isReadOnly: true);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBindMount(source: string, target: string, isReadOnly?: boolean): ContainerResource",
"parameters": [
{
"name": "source",
- "type": "string"
+ "type": "string",
+ "description": "The source path of the mount. This is the path to the file or directory on the host, relative to the app host project directory."
},
{
"name": "target",
- "type": "string"
+ "type": "string",
+ "description": "The target path where the file or directory is mounted in the container."
},
{
"name": "isReadOnly",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "A flag that indicates if this is a read-only mount."
}
],
"returnType": "ContainerResource",
@@ -5654,17 +5634,20 @@
"name": "withBuildArg",
"capabilityId": "Aspire.Hosting/withBuildArg",
"qualifiedName": "withBuildArg",
- "description": "Adds a build argument from a string value or parameter resource",
+ "description": "Adds a build argument when the container is built from a Dockerfile.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBuildArg(name: string, value: ParameterResource): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the build argument."
},
{
"name": "value",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The build argument value, either a string or a parameter resource."
}
],
"returnType": "ContainerResource",
@@ -5678,17 +5661,21 @@
"name": "withBuildSecret",
"capabilityId": "Aspire.Hosting/withParameterBuildSecret",
"qualifiedName": "withBuildSecret",
- "description": "Adds a build secret from a parameter resource",
+ "description": "Adds a secret build argument when the container is built from a Dockerfile.",
+ "remarks": "The `WithBuildSecret``1` extension method\nresults in a `--secret` argument being appended to the `docker build` or `podman build` command. This overload results in an environment\nvariable-based secret being passed to the build process. The value of the environment variable is the value of the secret referenced by the `ParameterResource`.\nAdding a build secret based on a parameter.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar accessToken = builder.AddParameter(\"accessToken\", secret: true);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfile(\"../mycontainer\")\n.WithBuildSecret(\"ACCESS_TOKEN\", accessToken);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBuildSecret(name: string, value: ParameterResource): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret build argument."
},
{
"name": "value",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The resource builder for a parameter resource."
}
],
"returnType": "ContainerResource",
@@ -5702,15 +5689,17 @@
"name": "withCertificateTrustConfig",
"capabilityId": "Aspire.Hosting/withCertificateTrustConfig",
"qualifiedName": "withCertificateTrustConfig",
- "description": "Adds a certificate trust configuration gatherer",
+ "description": "Adds a certificate trust configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
- "signature": "withCertificateTrustConfig(configContextFactory: (arg: CertificateTrustScope) =\u003E Promise\u003CCertificateTrustExecutionConfigurationContext\u003E): IExecutionConfigurationBuilder",
+ "signature": "withCertificateTrustConfig(configContextFactory: (arg: CertificateTrustScope) => Promise): IExecutionConfigurationBuilder",
"parameters": [
{
"name": "configContextFactory",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: CertificateTrustScope) =\u003E Promise\u003CCertificateTrustExecutionConfigurationContext\u003E"
+ "callbackSignature": "(arg: CertificateTrustScope) => Promise",
+ "description": "A factory function to create the configuration context."
}
],
"returnType": "IExecutionConfigurationBuilder",
@@ -5723,13 +5712,16 @@
"name": "withCertificateTrustScope",
"capabilityId": "Aspire.Hosting/withCertificateTrustScope",
"qualifiedName": "withCertificateTrustScope",
- "description": "Sets the certificate trust scope",
+ "description": "Sets the `CertificateTrustScope` for custom certificate authorities associated with the resource. The scope specifies how custom certificate authorities should be applied to a resource at run time in local development scenarios. Custom certificate trust is only applied in run mode; in publish mode resources will use their default certificate trust behavior.",
+ "remarks": "The default scope if not overridden is `Append` which means that custom certificate\nauthorities should be appended to the default trusted certificate authorities for the resource. Setting the scope to\n`Override` indicates the set of certificates in referenced\n`CertificateAuthorityCollection` (and optionally Aspire developer certificiates) should be used as the\nexclusive source of trust for a resource.\nIn all cases, this is a best effort implementation as not all resources support full customization of certificate\ntrust.\nSet the scope for custom certificate authorities to override the default trusted certificate authorities for a container resource.\n```\nvar caCollection = builder.AddCertificateAuthorityCollection(\"my-cas\")\n.WithCertificate(new X509Certificate2(\"my-ca.pem\"));\nvar container = builder.AddContainer(\"my-service\", \"my-service:latest\")\n.WithCertificateAuthorityCollection(caCollection)\n.WithCertificateTrustScope(CertificateTrustScope.Override);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withCertificateTrustScope(scope: CertificateTrustScope): IResourceWithEnvironment",
"parameters": [
{
"name": "scope",
- "type": "CertificateTrustScope"
+ "type": "CertificateTrustScope",
+ "description": "The scope to apply to custom certificate authorities associated with the resource."
}
],
"returnType": "IResourceWithEnvironment",
@@ -5747,13 +5739,16 @@
"name": "withChildRelationship",
"capabilityId": "Aspire.Hosting/withBuilderChildRelationship",
"qualifiedName": "withChildRelationship",
- "description": "Sets a child relationship",
+ "description": "Adds a `ResourceRelationshipAnnotation` to the resource annotations to add a parent-child relationship.",
+ "remarks": "The `WithChildRelationship` method is used to add child relationships to the resource. Relationships are used to link\nresources together in UI.\nThis example shows adding a relationship between two resources.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar parameter = builder.AddParameter(\"parameter\");\nvar backend = builder.AddProject(\"backend\");\n.WithChildRelationship(parameter);\n```",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withChildRelationship(child: IResource): IResource",
"parameters": [
{
"name": "child",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The child of `builder`."
}
],
"returnType": "IResource",
@@ -5774,28 +5769,34 @@
"name": "withCommand",
"capabilityId": "Aspire.Hosting/withCommand",
"qualifiedName": "withCommand",
- "description": "Adds a resource command",
+ "description": "Adds a `ResourceCommandAnnotation` to the resource annotations to add a resource command.",
+ "remarks": "The `WithCommand` method is used to add commands to the resource. Commands are displayed in the dashboard\nand can be executed by a user using the dashboard UI.\nWhen a command is executed, the `executeCommand` callback is called and is run inside the Aspire host.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withCommand(name: string, displayName: string, executeCommand: (arg: ExecuteCommandContext) =\u003E Promise\u003CExecuteCommandResult\u003E, commandOptions?: CommandOptions): IResource",
+ "signature": "withCommand(name: string, displayName: string, executeCommand: (arg: ExecuteCommandContext) => Promise, commandOptions?: CommandOptions): IResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the command. The name uniquely identifies the command."
},
{
"name": "displayName",
- "type": "string"
+ "type": "string",
+ "description": "The display name visible in UI."
},
{
"name": "executeCommand",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ExecuteCommandContext) =\u003E Promise\u003CExecuteCommandResult\u003E"
+ "callbackSignature": "(arg: ExecuteCommandContext) => Promise",
+ "description": "A callback that is executed when the command is executed. The callback is run inside the Aspire host. The callback result is used to indicate success or failure in the UI."
},
{
"name": "commandOptions",
"type": "CommandOptions",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional configuration for the command."
}
],
"returnType": "IResource",
@@ -5816,17 +5817,20 @@
"name": "withConnectionProperty",
"capabilityId": "Aspire.Hosting/withConnectionProperty",
"qualifiedName": "withConnectionProperty",
- "description": "Adds a connection property with a string or reference expression value",
+ "description": "Adds a connection property annotation to the resource being built.",
+ "returns": "The same resource builder instance with the specified connection property annotation applied.",
"kind": "Method",
"signature": "withConnectionProperty(name: string, value: ReferenceExpression): IResourceWithConnectionString",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the connection property to add."
},
{
"name": "value",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The value to assign to the connection property, specified as a string or reference expression."
}
],
"returnType": "IResourceWithConnectionString",
@@ -5840,24 +5844,28 @@
"name": "withContainerCertificatePaths",
"capabilityId": "Aspire.Hosting/withContainerCertificatePaths",
"qualifiedName": "withContainerCertificatePaths",
- "description": "Overrides container certificate bundle and directory paths used for trust configuration",
+ "description": "Adds container certificate path overrides used for certificate trust at run time.",
+ "returns": "The updated resource builder.",
"kind": "Method",
"signature": "withContainerCertificatePaths(customCertificatesDestination?: string, defaultCertificateBundlePaths?: string[], defaultCertificateDirectoryPaths?: string[]): ContainerResource",
"parameters": [
{
"name": "customCertificatesDestination",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The destination path in the container where custom certificates will be copied."
},
{
"name": "defaultCertificateBundlePaths",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Default certificate bundle paths in the container that will be replaced."
},
{
"name": "defaultCertificateDirectoryPaths",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Default certificate directory paths in the container that may be appended."
}
],
"returnType": "ContainerResource",
@@ -5871,13 +5879,15 @@
"name": "withContainerFilesSource",
"capabilityId": "Aspire.Hosting/withContainerFilesSource",
"qualifiedName": "withContainerFilesSource",
- "description": "Sets the source directory for container files",
+ "description": "Adds a container files source annotation to the resource being built, specifying the path to the container files source.",
+ "returns": "The resource builder instance with the container files source annotation applied.",
"kind": "Method",
"signature": "withContainerFilesSource(sourcePath: string): IResourceWithContainerFiles",
"parameters": [
{
"name": "sourcePath",
- "type": "string"
+ "type": "string",
+ "description": "The path to the container files source to associate with the resource. Cannot be null."
}
],
"returnType": "IResourceWithContainerFiles",
@@ -5891,13 +5901,16 @@
"name": "withContainerName",
"capabilityId": "Aspire.Hosting/withContainerName",
"qualifiedName": "withContainerName",
- "description": "Sets the container name",
+ "description": "Overrides the default container name for this resource. By default Aspire generates a unique container name based on the resource name and a random postfix (or a postfix based on a hash of the AppHost project path for persistent container resources). This method allows you to override that behavior with a custom name, but could lead to naming conflicts if the specified name is not unique.",
+ "remarks": "Combining this with `Persistent` will allow Aspire to re-use an existing container that was not\ncreated by an Aspire AppHost.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerName(name: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The desired container name. Must be a valid container name or your runtime will report an error."
}
],
"returnType": "ContainerResource",
@@ -5911,13 +5924,16 @@
"name": "withContainerNetworkAlias",
"capabilityId": "Aspire.Hosting/withContainerNetworkAlias",
"qualifiedName": "withContainerNetworkAlias",
- "description": "Adds a network alias for the container",
+ "description": "Adds a network alias to container resource.",
+ "remarks": "Network aliases enable DNS resolution of the container on the network by custom names.\nBy default, containers are accessible on the network using their resource name as a DNS alias.\nThis method allows adding additional aliases for the same container.\nMultiple aliases can be added by calling this method multiple times.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerNetworkAlias(alias: string): ContainerResource",
"parameters": [
{
"name": "alias",
- "type": "string"
+ "type": "string",
+ "description": "The network alias for the container."
}
],
"returnType": "ContainerResource",
@@ -5931,13 +5947,16 @@
"name": "withContainerRegistry",
"capabilityId": "Aspire.Hosting/withContainerRegistry",
"qualifiedName": "withContainerRegistry",
- "description": "Configures a resource to use a container registry",
+ "description": "Configures the resource to use the specified container registry for container image operations.",
+ "remarks": "This method adds a `ContainerRegistryReferenceAnnotation` to the resource,\nindicating that the resource should use the specified container registry for container image operations.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
"signature": "withContainerRegistry(registry: IResource): IResource",
"parameters": [
{
"name": "registry",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The container registry resource builder."
}
],
"returnType": "IResource",
@@ -5958,13 +5977,16 @@
"name": "withContainerRuntimeArgs",
"capabilityId": "Aspire.Hosting/withContainerRuntimeArgs",
"qualifiedName": "withContainerRuntimeArgs",
- "description": "Adds runtime arguments for the container",
+ "description": "Adds a callback to be executed with a list of arguments to add to the container runtime run command when a container resource is started.",
+ "remarks": "This is intended to pass additional arguments to the underlying container runtime run command to enable advanced features such as exposing GPUs to the container. To pass runtime arguments to the actual container, use the `WithArgs``1` method.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerRuntimeArgs(args: string[]): ContainerResource",
"parameters": [
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to be passed to the container runtime run command when the container resource is started."
}
],
"returnType": "ContainerResource",
@@ -5978,19 +6000,22 @@
"name": "withDescription",
"capabilityId": "Aspire.Hosting/withDescription",
"qualifiedName": "withDescription",
- "description": "Sets a parameter description",
+ "description": "Sets the description of the parameter resource.",
+ "returns": "Resource builder for the parameter.",
"kind": "Method",
"signature": "withDescription(description: string, enableMarkdown?: boolean): ParameterResource",
"parameters": [
{
"name": "description",
- "type": "string"
+ "type": "string",
+ "description": "The parameter description."
},
{
"name": "enableMarkdown",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "A value indicating whether the description should be rendered as Markdown. `true` allows the description to contain Markdown elements such as links, text decoration and lists."
}
],
"returnType": "ParameterResource",
@@ -6004,13 +6029,16 @@
"name": "withDeveloperCertificateTrust",
"capabilityId": "Aspire.Hosting/withDeveloperCertificateTrust",
"qualifiedName": "withDeveloperCertificateTrust",
- "description": "Configures developer certificate trust",
+ "description": "Indicates whether developer certificates should be treated as trusted certificate authorities for the resource at run time. Currently this indicates trust for the ASP.NET Core developer certificate. The developer certificate will only be trusted when running in local development scenarios; in publish mode resources will use their default certificate trust.",
+ "remarks": "Disable trust for app host managed developer certificate(s) for a container resource.\n```\nvar container = builder.AddContainer(\"my-service\", \"my-service:latest\")\n.WithDeveloperCertificateTrust(false);\n```\nDisable automatic trust for app host managed developer certificate(s), but explicitly enable it for a specific resource.\n```\nvar builder = DistributedApplication.CreateBuilder(new DistributedApplicationOptions()\n{\nArgs = args,\nTrustDeveloperCertificate = false,\n});\nvar project = builder.AddProject(\"my-service\")\n.WithDeveloperCertificateTrust(true);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDeveloperCertificateTrust(trust: boolean): IResourceWithEnvironment",
"parameters": [
{
"name": "trust",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Indicates whether the developer certificate should be treated as trusted."
}
],
"returnType": "IResourceWithEnvironment",
@@ -6028,23 +6056,28 @@
"name": "withDockerfile",
"capabilityId": "Aspire.Hosting/withDockerfile",
"qualifiedName": "withDockerfile",
- "description": "Configures the resource to use a Dockerfile",
+ "description": "Causes Aspire to build the specified container image from a Dockerfile.",
+ "remarks": "When this method is called an annotation is added to the `ContainerResource` that specifies the context path and\nDockerfile path to be used when building the container image. These details are then used by the orchestrator to build the image\nbefore using that image to start the container.\nThe `contextPath` is relative to the AppHost directory unless it is a fully qualified path.\nThe `dockerfilePath` is relative to the `contextPath` unless it is a fully qualified path.\nIf the `dockerfilePath` is not provided, it defaults to \"Dockerfile\" in the `contextPath`.\nWhen generating the manifest for deployment tools, the `WithDockerfile``1`\nmethod results in an additional attribute being added to the `container.v0` resource type which contains the configuration\nnecessary to allow the deployment tool to build the container image prior to deployment.\nCreates a container called `mycontainer` with an image called `myimage`.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfile(\"path/to/context\");\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDockerfile(contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource",
"parameters": [
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "dockerfilePath",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Path to the Dockerfile relative to the `contextPath`. Defaults to \"Dockerfile\" if not specified."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -6058,19 +6091,23 @@
"name": "withDockerfileBaseImage",
"capabilityId": "Aspire.Hosting/withDockerfileBaseImage",
"qualifiedName": "withDockerfileBaseImage",
- "description": "Sets the base image for a Dockerfile build",
+ "description": "Configures custom base images for generated Dockerfiles.",
+ "remarks": "This extension method allows customization of the base images used in generated Dockerfiles.\nFor multi-stage Dockerfiles (e.g., Python with UV), you can specify separate build and runtime images.\nSpecify custom base images for a Python application:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddPythonApp(\"myapp\", \"path/to/app\", \"main.py\")\n.WithDockerfileBaseImage(\nbuildImage: \"ghcr.io/astral-sh/uv:python3.12-bookworm-slim\",\nruntimeImage: \"python:3.12-slim-bookworm\");\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDockerfileBaseImage(buildImage?: string, runtimeImage?: string): IResource",
"parameters": [
{
"name": "buildImage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The base image to use for the build stage. If null, uses the default build image."
},
{
"name": "runtimeImage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The base image to use for the runtime stage. If null, uses the default runtime image."
}
],
"returnType": "IResource",
@@ -6091,24 +6128,29 @@
"name": "withDockerfileBuilder",
"capabilityId": "Aspire.Hosting/withDockerfileBuilder",
"qualifiedName": "withDockerfileBuilder",
- "description": "Configures the resource to use a programmatically generated Dockerfile",
+ "description": "Builds the specified container image from a Dockerfile generated by a callback using the `DockerfileBuilder` API.",
+ "remarks": "This method provides a programmatic way to build Dockerfiles using the `DockerfileBuilder` API\ninstead of string manipulation. Callbacks can be composed by calling this method multiple times - each callback will be invoked\nin order to build up the final Dockerfile.\nThe `contextPath` is relative to the AppHost directory unless it is fully qualified.\nCreates a container with a programmatically built Dockerfile using fluent API:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfileBuilder(\"path/to/context\", context =>\n{\ncontext.Builder.From(\"alpine:latest\")\n.WorkDir(\"/app\")\n.Run(\"apk add curl\")\n.Copy(\".\", \".\")\n.Cmd([\"./myapp\"]);\nreturn Task.CompletedTask;\n});\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withDockerfileBuilder(contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E, stage?: string): ContainerResource",
+ "signature": "withDockerfileBuilder(contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) => Promise, stage?: string): ContainerResource",
"parameters": [
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: DockerfileBuilderCallbackContext) => Promise",
+ "description": "A callback that uses the `DockerfileBuilder` API to construct the Dockerfile."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -6122,7 +6164,8 @@
"name": "withEndpoint",
"capabilityId": "Aspire.Hosting/withEndpoint",
"qualifiedName": "withEndpoint",
- "description": "Adds a network endpoint",
+ "description": "Exposes an endpoint on a resource. A reference to this endpoint can be retrieved using `GetEndpoint``1`. The endpoint name will be the scheme name if not specified.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: ProtocolType): IResourceWithEndpoints",
"parameters": [
@@ -6130,46 +6173,54 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional port. This is the port that will be given to other resource to communicate with this resource."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "scheme",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional scheme e.g. (http/https). Defaults to the `protocol` argument if it is defined or \"tcp\" otherwise."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to the scheme name if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable that will be used to inject the `targetPort`. If the target port is null one will be dynamically generated and assigned to the environment variable."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
},
{
"name": "isExternal",
"type": "boolean",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "Indicates that this endpoint should be exposed externally at publish time."
},
{
"name": "protocol",
"type": "ProtocolType",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "Network protocol: TCP or UDP are supported today, others possibly in future."
}
],
"returnType": "IResourceWithEndpoints",
@@ -6189,7 +6240,7 @@
"qualifiedName": "withEndpointCallback",
"description": "Updates a named endpoint via callback",
"kind": "Method",
- "signature": "withEndpointCallback(endpointName: string, callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withEndpointCallback(endpointName: string, callback: (obj: EndpointUpdateContext) => Promise, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "endpointName",
@@ -6199,7 +6250,7 @@
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "createIfNotExists",
@@ -6223,13 +6274,16 @@
"name": "withEndpointProxySupport",
"capabilityId": "Aspire.Hosting/withEndpointProxySupport",
"qualifiedName": "withEndpointProxySupport",
- "description": "Configures endpoint proxy support",
+ "description": "Set whether a container resource can use proxied endpoints or whether they should be disabled for all endpoints belonging to the container. If set to `false`, endpoints belonging to the container resource will ignore the configured proxy settings and run proxy-less.",
+ "remarks": "This method is intended to support scenarios with persistent lifetime containers where it is desirable for the container to be accessible over the same\nport whether the Aspire application is running or not. Proxied endpoints bind ports that are only accessible while the Aspire application is running.\nThe user needs to be careful to ensure that container endpoints are using unique ports when disabling proxy support as by default for proxy-less\nendpoints, Aspire will allocate the internal container port as the host port, which will increase the chance of port conflicts.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEndpointProxySupport(proxyEnabled: boolean): ContainerResource",
"parameters": [
{
"name": "proxyEnabled",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Should endpoints for the container resource support using a proxy?"
}
],
"returnType": "ContainerResource",
@@ -6243,13 +6297,15 @@
"name": "withEntrypoint",
"capabilityId": "Aspire.Hosting/withEntrypoint",
"qualifiedName": "withEntrypoint",
- "description": "Sets the container entrypoint",
+ "description": "Sets the Entrypoint for the container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEntrypoint(entrypoint: string): ContainerResource",
"parameters": [
{
"name": "entrypoint",
- "type": "string"
+ "type": "string",
+ "description": "The new entrypoint for the container."
}
],
"returnType": "ContainerResource",
@@ -6291,15 +6347,17 @@
"name": "withEnvironmentCallback",
"capabilityId": "Aspire.Hosting/withEnvironmentCallback",
"qualifiedName": "withEnvironmentCallback",
- "description": "Sets environment variables via callback",
+ "description": "Allows for the population of environment variables on a resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withEnvironmentCallback(callback: (arg: EnvironmentCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResourceWithEnvironment",
+ "signature": "withEnvironmentCallback(callback: (arg: EnvironmentCallbackContext) => Promise): IResourceWithEnvironment",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EnvironmentCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EnvironmentCallbackContext) => Promise",
+ "description": "A callback that allows for deferred execution for computing many environment variables. This runs after resources have been allocated by the orchestrator and allows access to other resources to resolve computed data, e.g. connection strings, ports."
}
],
"returnType": "IResourceWithEnvironment",
@@ -6317,7 +6375,8 @@
"name": "withEnvironmentVariablesConfig",
"capabilityId": "Aspire.Hosting/withEnvironmentVariablesConfig",
"qualifiedName": "withEnvironmentVariablesConfig",
- "description": "Adds an environment variables configuration gatherer",
+ "description": "Adds an environment variables configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
"signature": "withEnvironmentVariablesConfig(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -6331,13 +6390,15 @@
"name": "withExecutableCommand",
"capabilityId": "Aspire.Hosting/withExecutableCommand",
"qualifiedName": "withExecutableCommand",
- "description": "Sets the executable command",
+ "description": "Sets the command for the executable resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExecutableCommand(command: string): ExecutableResource",
"parameters": [
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "Command."
}
],
"returnType": "ExecutableResource",
@@ -6352,7 +6413,9 @@
"name": "withExplicitStart",
"capabilityId": "Aspire.Hosting/withExplicitStart",
"qualifiedName": "withExplicitStart",
- "description": "Prevents resource from starting automatically",
+ "description": "Adds a `ExplicitStartupAnnotation` annotation to the resource so it doesn't automatically start with the app host startup.",
+ "remarks": "This method is useful when a resource shouldn't automatically start when the app host starts.\nThe database clean up tool project isn't started with the app host.\nThe resource start command can be used to run it ondemand later.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar pgsql = builder.AddPostgres(\"postgres\");\nbuilder.AddProject(\"dbcleanuptool\")\n.WithReference(pgsql)\n.WithExplicitStart();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExplicitStart(): IResource",
"parameters": [],
@@ -6374,7 +6437,8 @@
"name": "withExternalHttpEndpoints",
"capabilityId": "Aspire.Hosting/withExternalHttpEndpoints",
"qualifiedName": "withExternalHttpEndpoints",
- "description": "Makes HTTP endpoints externally accessible",
+ "description": "Marks existing http or https endpoints on a resource as external.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExternalHttpEndpoints(): IResourceWithEndpoints",
"parameters": [],
@@ -6393,13 +6457,16 @@
"name": "withHealthCheck",
"capabilityId": "Aspire.Hosting/withHealthCheck",
"qualifiedName": "withHealthCheck",
- "description": "Adds a health check by key",
+ "description": "Adds a `HealthCheckAnnotation` to the resource annotations to associate a resource with a named health check managed by the health check service.",
+ "remarks": "The `WithHealthCheck``1` method is used in conjunction with\nthe `WaitFor``1` to associate a resource\nregistered in the application hosts dependency injection container. The `WithHealthCheck``1`\nmethod does not inject the health check itself it is purely an association mechanism.\nDefine a custom health check and associate it with a resource.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar startAfter = DateTime.Now.AddSeconds(30);\nbuilder.Services.AddHealthChecks().AddCheck(mycheck\", () =>\n{\nreturn DateTime.Now > startAfter ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();\n});\nvar pg = builder.AddPostgres(\"pg\")\n.WithHealthCheck(\"mycheck\");\nbuilder.AddProject(\"myapp\")\n.WithReference(pg)\n.WaitFor(pg); // This will result in waiting for the building check, and the\n// custom check defined in the code.\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHealthCheck(key: string): IResource",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key for the health check."
}
],
"returnType": "IResource",
@@ -6453,7 +6520,9 @@
"name": "withHttpEndpoint",
"capabilityId": "Aspire.Hosting/withHttpEndpoint",
"qualifiedName": "withHttpEndpoint",
- "description": "Adds an HTTP endpoint",
+ "description": "Exposes an HTTP endpoint on a resource, or updates the existing HTTP endpoint if one with the same name already exists. This endpoint reference can be retrieved using `GetEndpoint``1`. The endpoint name will be \"http\" if not specified.",
+ "remarks": "If an endpoint with the same name already exists on the resource, the existing endpoint is updated\nwith any non-null parameter values. Parameters left as `null` will not modify the existing endpoint's values.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpEndpoint(port?: number, targetPort?: number, name?: string, env?: string, isProxied?: boolean): IResourceWithEndpoints",
"parameters": [
@@ -6461,29 +6530,34 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional port. This is the port that will be given to other resource to communicate with this resource."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to \"http\" if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable to inject."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
}
],
"returnType": "IResourceWithEndpoints",
@@ -6503,13 +6577,13 @@
"qualifiedName": "withHttpEndpointCallback",
"description": "Updates an HTTP endpoint via callback",
"kind": "Method",
- "signature": "withHttpEndpointCallback(callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withHttpEndpointCallback(callback: (obj: EndpointUpdateContext) => Promise, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "name",
@@ -6538,7 +6612,7 @@
"name": "withHttpHealthCheck",
"capabilityId": "Aspire.Hosting/withExternalServiceHttpHealthCheck",
"qualifiedName": "withHttpHealthCheck",
- "description": "Adds an HTTP health check to the external service",
+ "description": "Adds an HTTP health check to the external service for polyglot app hosts.",
"kind": "Method",
"signature": "withHttpHealthCheck(path?: string, statusCode?: number, endpointName?: string): ExternalServiceResource",
"parameters": [
@@ -6570,25 +6644,30 @@
"name": "withHttpHealthCheck",
"capabilityId": "Aspire.Hosting/withHttpHealthCheck",
"qualifiedName": "withHttpHealthCheck",
- "description": "Adds an HTTP health check",
+ "description": "Adds a health check to the resource which is mapped to a specific endpoint.",
+ "remarks": "This method adds a health check to the health check service which polls the specified endpoint on the resource\non a periodic basis. The base address is dynamically determined based on the endpoint that was selected. By\ndefault the path is set to \"/\" and the status code is set to 200.\nThis example shows adding an HTTP health check to a backend project.\nThe health check makes sure that the front end does not start until the backend is\nreporting a healthy status based on the return code returned from the\n\"/health\" path on the backend server.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar backend = builder.AddProject(\"backend\")\n.WithHttpHealthCheck(\"/health\");\nbuilder.AddProject(\"frontend\")\n.WithReference(backend).WaitFor(backend);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpHealthCheck(path?: string, statusCode?: number, endpointName?: string): IResourceWithEndpoints",
"parameters": [
{
"name": "path",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The relative path to test."
},
{
"name": "statusCode",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "The result code to interpret as healthy."
},
{
"name": "endpointName",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the endpoint to derive the base address from."
}
],
"returnType": "IResourceWithEndpoints",
@@ -6606,7 +6685,7 @@
"name": "withHttpProbe",
"capabilityId": "Aspire.Hosting/withHttpProbe",
"qualifiedName": "withHttpProbe",
- "description": "Adds an HTTP health probe to the resource",
+ "description": "ATS export stub for `WithHttpProbe``1` with renamed parameter to avoid reserved keyword conflicts in Go and Rust.",
"kind": "Method",
"signature": "withHttpProbe(probeType: ProbeType, path?: string, initialDelaySeconds?: number, periodSeconds?: number, timeoutSeconds?: number, failureThreshold?: number, successThreshold?: number, endpointName?: string): IResourceWithEndpoints",
"parameters": [
@@ -6670,15 +6749,17 @@
"name": "withHttpsCertificateConfig",
"capabilityId": "Aspire.Hosting/withHttpsCertificateConfigExport",
"qualifiedName": "withHttpsCertificateConfig",
- "description": "Adds an HTTPS certificate configuration gatherer",
+ "description": "Adds an HTTPS certificate configuration gatherer using certificate metadata instead of a raw X509 certificate.",
+ "returns": "The execution configuration builder.",
"kind": "Method",
- "signature": "withHttpsCertificateConfig(configContextFactory: (arg: HttpsCertificateInfo) =\u003E Promise\u003CHttpsCertificateExecutionConfigurationContext\u003E): IExecutionConfigurationBuilder",
+ "signature": "withHttpsCertificateConfig(configContextFactory: (arg: HttpsCertificateInfo) => Promise): IExecutionConfigurationBuilder",
"parameters": [
{
"name": "configContextFactory",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: HttpsCertificateInfo) =\u003E Promise\u003CHttpsCertificateExecutionConfigurationContext\u003E"
+ "callbackSignature": "(arg: HttpsCertificateInfo) => Promise",
+ "description": "The factory that creates the HTTPS certificate configuration context."
}
],
"returnType": "IExecutionConfigurationBuilder",
@@ -6691,14 +6772,17 @@
"name": "withHttpsDeveloperCertificate",
"capabilityId": "Aspire.Hosting/withParameterHttpsDeveloperCertificate",
"qualifiedName": "withHttpsDeveloperCertificate",
- "description": "Configures HTTPS with a developer certificate",
+ "description": "Indicates that a resource should use the developer certificate key pair for HTTPS endpoints at run time. Currently this indicates use of the ASP.NET Core developer certificate. The developer certificate will only be used when running in local development scenarios; in publish mode resources will use their default certificate configuration.",
+ "remarks": "Use the developer certificate for HTTPS/TLS endpoints on a container resource:\n```\nbuilder.AddContainer(\"my-service\", \"my-image\")\n.WithHttpsDeveloperCertificate()\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpsDeveloperCertificate(password?: ParameterResource): IResourceWithEnvironment",
"parameters": [
{
"name": "password",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "A parameter specifying the password used to encrypt the certificate private key."
}
],
"returnType": "IResourceWithEnvironment",
@@ -6716,7 +6800,9 @@
"name": "withHttpsEndpoint",
"capabilityId": "Aspire.Hosting/withHttpsEndpoint",
"qualifiedName": "withHttpsEndpoint",
- "description": "Adds an HTTPS endpoint",
+ "description": "Exposes an HTTPS endpoint on a resource, or updates the existing HTTPS endpoint if one with the same name already exists. This endpoint reference can be retrieved using `GetEndpoint``1`. The endpoint name will be \"https\" if not specified.",
+ "remarks": "If an endpoint with the same name already exists on the resource, the existing endpoint is updated\nwith any non-null parameter values. Parameters left as `null` will not modify the existing endpoint's values.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpsEndpoint(port?: number, targetPort?: number, name?: string, env?: string, isProxied?: boolean): IResourceWithEndpoints",
"parameters": [
@@ -6724,29 +6810,34 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional host port."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to \"https\" if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable to inject."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
}
],
"returnType": "IResourceWithEndpoints",
@@ -6766,13 +6857,13 @@
"qualifiedName": "withHttpsEndpointCallback",
"description": "Updates an HTTPS endpoint via callback",
"kind": "Method",
- "signature": "withHttpsEndpointCallback(callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withHttpsEndpointCallback(callback: (obj: EndpointUpdateContext) => Promise, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "name",
@@ -6801,19 +6892,23 @@
"name": "withIconName",
"capabilityId": "Aspire.Hosting/withIconName",
"qualifiedName": "withIconName",
- "description": "Sets the icon for the resource",
+ "description": "Specifies the icon to use when displaying the resource in the dashboard.",
+ "remarks": "This method allows you to specify a custom FluentUI icon that will be displayed for the resource in the dashboard.\nIf no custom icon is specified, the dashboard will use default icons based on the resource type.\nSet a Redis resource to use the Database icon:\n```\nvar redis = builder.AddContainer(\"redis\", \"redis:latest\")\n.WithIconName(\"Database\");\n```\nSet a custom service to use a specific icon with Regular variant:\n```\nvar service = builder.AddProject(\"service\")\n.WithIconName(\"CloudArrowUp\", IconVariant.Regular);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withIconName(iconName: string, iconVariant?: IconVariant): IResource",
"parameters": [
{
"name": "iconName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the FluentUI icon to use. See https://aka.ms/fluentui-system-icons for available icons."
},
{
"name": "iconVariant",
"type": "IconVariant",
"isOptional": true,
- "defaultValue": "Filled"
+ "defaultValue": "Filled",
+ "description": "The variant of the icon (Regular or Filled). Defaults to Filled."
}
],
"returnType": "IResource",
@@ -6834,18 +6929,21 @@
"name": "withImage",
"capabilityId": "Aspire.Hosting/withImage",
"qualifiedName": "withImage",
- "description": "Sets the container image",
+ "description": "Allows overriding the image on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImage(image: string, tag?: string): ContainerResource",
"parameters": [
{
"name": "image",
- "type": "string"
+ "type": "string",
+ "description": "Image value."
},
{
"name": "tag",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Tag value."
}
],
"returnType": "ContainerResource",
@@ -6859,13 +6957,15 @@
"name": "withImagePullPolicy",
"capabilityId": "Aspire.Hosting/withImagePullPolicy",
"qualifiedName": "withImagePullPolicy",
- "description": "Sets the container image pull policy",
+ "description": "Sets the pull policy for the container resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImagePullPolicy(pullPolicy: ImagePullPolicy): ContainerResource",
"parameters": [
{
"name": "pullPolicy",
- "type": "ImagePullPolicy"
+ "type": "ImagePullPolicy",
+ "description": "The pull policy behavior for the container resource."
}
],
"returnType": "ContainerResource",
@@ -6879,15 +6979,18 @@
"name": "withImagePushOptions",
"capabilityId": "Aspire.Hosting/withImagePushOptions",
"qualifiedName": "withImagePushOptions",
- "description": "Sets image push options via callback",
+ "description": "Adds an asynchronous callback to configure container image push options for the resource.",
+ "remarks": "This method allows customization of how container images are named and tagged when pushed to a registry using an asynchronous callback.\nUse this overload when the callback needs to perform asynchronous operations such as retrieving configuration values from external sources.\nThe callback receives a `ContainerImagePushOptionsCallbackContext` that provides access to the resource\nand the `ContainerImagePushOptions` that can be modified.\nMultiple callbacks can be registered on the same resource, and they will be invoked in the order they were added.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withImagePushOptions(callback: (arg: ContainerImagePushOptionsCallbackContext) =\u003E Promise\u003Cvoid\u003E): IComputeResource",
+ "signature": "withImagePushOptions(callback: (arg: ContainerImagePushOptionsCallbackContext) => Promise): IComputeResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ContainerImagePushOptionsCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ContainerImagePushOptionsCallbackContext) => Promise",
+ "description": "The asynchronous callback to configure push options."
}
],
"returnType": "IComputeResource",
@@ -6905,13 +7008,15 @@
"name": "withImageRegistry",
"capabilityId": "Aspire.Hosting/withImageRegistry",
"qualifiedName": "withImageRegistry",
- "description": "Sets the container image registry",
+ "description": "Allows overriding the image registry on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageRegistry(registry: string): ContainerResource",
"parameters": [
{
"name": "registry",
- "type": "string"
+ "type": "string",
+ "description": "Registry value."
}
],
"returnType": "ContainerResource",
@@ -6925,13 +7030,15 @@
"name": "withImageSHA256",
"capabilityId": "Aspire.Hosting/withImageSHA256",
"qualifiedName": "withImageSHA256",
- "description": "Sets the image SHA256 digest",
+ "description": "Allows setting the image to a specific sha256 on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageSHA256(sha256: string): ContainerResource",
"parameters": [
{
"name": "sha256",
- "type": "string"
+ "type": "string",
+ "description": "Registry value."
}
],
"returnType": "ContainerResource",
@@ -6945,13 +7052,15 @@
"name": "withImageTag",
"capabilityId": "Aspire.Hosting/withImageTag",
"qualifiedName": "withImageTag",
- "description": "Sets the container image tag",
+ "description": "Allows overriding the image tag on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageTag(tag: string): ContainerResource",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "Tag value."
}
],
"returnType": "ContainerResource",
@@ -6965,13 +7074,16 @@
"name": "withLifetime",
"capabilityId": "Aspire.Hosting/withLifetime",
"qualifiedName": "withLifetime",
- "description": "Sets the lifetime behavior of the container resource",
+ "description": "Sets the lifetime behavior of the container resource.",
+ "remarks": "Marking a container resource to have a `Persistent` lifetime.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithLifetime(ContainerLifetime.Persistent);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withLifetime(lifetime: ContainerLifetime): ContainerResource",
"parameters": [
{
"name": "lifetime",
- "type": "ContainerLifetime"
+ "type": "ContainerLifetime",
+ "description": "The lifetime behavior of the container resource. The defaults behavior is `Session`."
}
],
"returnType": "ContainerResource",
@@ -6985,7 +7097,9 @@
"name": "withMcpServer",
"capabilityId": "Aspire.Hosting/withMcpServer",
"qualifiedName": "withMcpServer",
- "description": "Configures an MCP server endpoint on the resource",
+ "description": "Marks the resource as hosting a Model Context Protocol (MCP) server on the specified endpoint.",
+ "remarks": "This method adds an `McpServerEndpointAnnotation` to the resource, enabling the Aspire tooling\nto discover and proxy the MCP server exposed by the resource.",
+ "returns": "A reference to the `IResourceBuilder`1` for chaining additional configuration.",
"kind": "Method",
"signature": "withMcpServer(path?: string, endpointName?: string): IResourceWithEndpoints",
"parameters": [
@@ -6993,12 +7107,14 @@
"name": "path",
"type": "string",
"isOptional": true,
- "defaultValue": "/mcp"
+ "defaultValue": "/mcp",
+ "description": "An optional path to append to the endpoint URL when forming the MCP server address. Defaults to `\"/mcp\"`."
},
{
"name": "endpointName",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint that hosts the MCP server. If not specified, defaults to the first HTTPS or HTTP endpoint."
}
],
"returnType": "IResourceWithEndpoints",
@@ -7042,7 +7158,9 @@
"name": "withoutHttpsCertificate",
"capabilityId": "Aspire.Hosting/withoutHttpsCertificate",
"qualifiedName": "withoutHttpsCertificate",
- "description": "Removes HTTPS certificate configuration",
+ "description": "Disable HTTPS/TLS server certificate configuration for the resource. No HTTPS/TLS termination configuration will be applied.",
+ "remarks": "Disable HTTPS certificate configuration for a Redis resource:\n```\nvar redis = builder.AddRedis(\"cache\")\n.WithoutHttpsCertificate();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withoutHttpsCertificate(): IResourceWithEnvironment",
"parameters": [],
@@ -7061,13 +7179,16 @@
"name": "withParentRelationship",
"capabilityId": "Aspire.Hosting/withBuilderParentRelationship",
"qualifiedName": "withParentRelationship",
- "description": "Sets the parent relationship",
+ "description": "Adds a `ResourceRelationshipAnnotation` to the resource annotations to add a parent-child relationship.",
+ "remarks": "The `WithParentRelationship` method is used to add parent relationships to the resource. Relationships are used to link\nresources together in UI.\nThis example shows adding a relationship between two resources.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar backend = builder.AddProject(\"backend\");\nvar frontend = builder.AddProject(\"frontend\")\n.WithParentRelationship(backend);\n```",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withParentRelationship(parent: IResource): IResource",
"parameters": [
{
"name": "parent",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The parent of `builder`."
}
],
"returnType": "IResource",
@@ -7088,15 +7209,17 @@
"name": "withPipelineConfiguration",
"capabilityId": "Aspire.Hosting/withPipelineConfiguration",
"qualifiedName": "withPipelineConfiguration",
- "description": "Configures pipeline step dependencies via a callback",
+ "description": "Registers a callback to be executed during the pipeline configuration phase, allowing modification of step dependencies and relationships.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
- "signature": "withPipelineConfiguration(callback: (obj: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withPipelineConfiguration(callback: (obj: PipelineConfigurationContext) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: PipelineConfigurationContext) => Promise",
+ "description": "The callback function to execute during the configuration phase."
}
],
"returnType": "IResource",
@@ -7117,39 +7240,46 @@
"name": "withPipelineStepFactory",
"capabilityId": "Aspire.Hosting/withPipelineStepFactory",
"qualifiedName": "withPipelineStepFactory",
- "description": "Adds a pipeline step to the resource",
+ "description": "Adds a pipeline step to the resource that will be executed during deployment.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
- "signature": "withPipelineStepFactory(stepName: string, callback: (arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string): IResource",
+ "signature": "withPipelineStepFactory(stepName: string, callback: (arg: PipelineStepContext) => Promise, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string): IResource",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The unique name of the pipeline step."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineStepContext) => Promise",
+ "description": "The callback to execute when the step runs."
},
{
"name": "dependsOn",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that this step depends on."
},
{
"name": "requiredBy",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that require this step."
},
{
"name": "tags",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional tags that categorize this step."
},
{
"name": "description",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional human-readable description of the step."
}
],
"returnType": "IResource",
@@ -7210,13 +7340,15 @@
"name": "withReferenceEnvironment",
"capabilityId": "Aspire.Hosting/withReferenceEnvironment",
"qualifiedName": "withReferenceEnvironment",
- "description": "Configures which reference values are injected into environment variables",
+ "description": "Configures how information is injected into environment variables when the resource references other resources.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withReferenceEnvironment(options: ReferenceEnvironmentInjectionOptions): IResourceWithEnvironment",
"parameters": [
{
"name": "options",
- "type": "ReferenceEnvironmentInjectionOptions"
+ "type": "ReferenceEnvironmentInjectionOptions",
+ "description": "Options controlling which reference information is emitted."
}
],
"returnType": "IResourceWithEnvironment",
@@ -7234,17 +7366,20 @@
"name": "withRelationship",
"capabilityId": "Aspire.Hosting/withBuilderRelationship",
"qualifiedName": "withRelationship",
- "description": "Adds a relationship to another resource",
+ "description": "Adds a relationship to another resource using its builder.",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withRelationship(resourceBuilder: IResource, type: string): IResource",
"parameters": [
{
"name": "resourceBuilder",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The resource builder that the relationship is to."
},
{
"name": "type",
- "type": "string"
+ "type": "string",
+ "description": "The relationship type."
}
],
"returnType": "IResource",
@@ -7265,13 +7400,16 @@
"name": "withRemoteImageName",
"capabilityId": "Aspire.Hosting/withRemoteImageName",
"qualifiedName": "withRemoteImageName",
- "description": "Sets the remote image name for publishing",
+ "description": "Sets the remote image name (without registry endpoint or tag) for container push operations.",
+ "remarks": "This is a convenience method that registers a callback to set the `RemoteImageName` property.\nThe remote image name should not include the registry endpoint or tag. Those are managed separately.\nThis method can be combined with `WithRemoteImageTag``1` to fully customize the image reference.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withRemoteImageName(remoteImageName: string): IComputeResource",
"parameters": [
{
"name": "remoteImageName",
- "type": "string"
+ "type": "string",
+ "description": "The remote image name (e.g., \"myapp\" or \"myorg/myapp\")."
}
],
"returnType": "IComputeResource",
@@ -7289,13 +7427,16 @@
"name": "withRemoteImageTag",
"capabilityId": "Aspire.Hosting/withRemoteImageTag",
"qualifiedName": "withRemoteImageTag",
- "description": "Sets the remote image tag for publishing",
+ "description": "Sets the remote image tag for container push operations.",
+ "remarks": "This is a convenience method that registers a callback to set the `RemoteImageTag` property.\nThe tag can be any valid container image tag such as version numbers, environment names, or deployment identifiers.\nThis method can be combined with `WithRemoteImageName``1` to fully customize the image reference.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withRemoteImageTag(remoteImageTag: string): IComputeResource",
"parameters": [
{
"name": "remoteImageTag",
- "type": "string"
+ "type": "string",
+ "description": "The remote image tag (e.g., \"latest\", \"v1.0.0\")."
}
],
"returnType": "IComputeResource",
@@ -7313,13 +7454,16 @@
"name": "withReplicas",
"capabilityId": "Aspire.Hosting/withReplicas",
"qualifiedName": "withReplicas",
- "description": "Sets the number of replicas",
+ "description": "Configures how many replicas of the project should be created for the project.",
+ "remarks": "When this method is applied to a project resource it will configure the app host to start multiple instances\nof the application based on the specified number of replicas. By default the app host automatically starts a\nreverse proxy for each process. When `WithReplicas` is\nused the reverse proxy will load balance traffic between the replicas.\nThis capability can be useful when debugging scale out scenarios to ensure state is appropriately managed\nwithin a cluster of instances.\nStart multiple instances of the same service.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddProject(\"inventoryservice\")\n.WithReplicas(3);\n```",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withReplicas(replicas: number): ProjectResource",
"parameters": [
{
"name": "replicas",
- "type": "number"
+ "type": "number",
+ "description": "The number of replicas."
}
],
"returnType": "ProjectResource",
@@ -7334,18 +7478,22 @@
"name": "withRequiredCommand",
"capabilityId": "Aspire.Hosting/withRequiredCommand",
"qualifiedName": "withRequiredCommand",
- "description": "Adds a required command dependency",
+ "description": "Declares that a resource requires a specific command/executable to be available on the local machine PATH before it can start.",
+ "remarks": "The command is considered valid if either:\n1. It is an absolute or relative path (contains a directory separator) that points to an existing file, or\n2. It is discoverable on the current process PATH (respecting PATHEXT on Windows).\nIf the command is not found, a warning message will be logged but the resource will be allowed to attempt to start.",
+ "returns": "The resource builder.",
"kind": "Method",
"signature": "withRequiredCommand(command: string, helpLink?: string): IResource",
"parameters": [
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "The command string (file name or path) that should be validated."
},
{
"name": "helpLink",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional help link URL to guide users when the command is missing."
}
],
"returnType": "IResource",
@@ -7366,7 +7514,8 @@
"name": "withToolIgnoreExistingFeeds",
"capabilityId": "Aspire.Hosting/withToolIgnoreExistingFeeds",
"qualifiedName": "withToolIgnoreExistingFeeds",
- "description": "Ignores existing NuGet feeds",
+ "description": "Configures the tool to use only the specified package sources, ignoring existing NuGet configuration.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolIgnoreExistingFeeds(): DotnetToolResource",
"parameters": [],
@@ -7381,7 +7530,8 @@
"name": "withToolIgnoreFailedSources",
"capabilityId": "Aspire.Hosting/withToolIgnoreFailedSources",
"qualifiedName": "withToolIgnoreFailedSources",
- "description": "Ignores failed NuGet sources",
+ "description": "Configures the resource to treat package source failures as warnings.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolIgnoreFailedSources(): DotnetToolResource",
"parameters": [],
@@ -7396,13 +7546,15 @@
"name": "withToolPackage",
"capabilityId": "Aspire.Hosting/withToolPackage",
"qualifiedName": "withToolPackage",
- "description": "Sets the tool package ID",
+ "description": "Sets the package identifier for the tool configuration associated with the resource builder.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolPackage(packageId: string): DotnetToolResource",
"parameters": [
{
"name": "packageId",
- "type": "string"
+ "type": "string",
+ "description": "The package identifier to assign to the tool configuration. Cannot be null."
}
],
"returnType": "DotnetToolResource",
@@ -7416,7 +7568,8 @@
"name": "withToolPrerelease",
"capabilityId": "Aspire.Hosting/withToolPrerelease",
"qualifiedName": "withToolPrerelease",
- "description": "Allows prerelease tool versions",
+ "description": "Allows prerelease versions of the tool to be used",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolPrerelease(): DotnetToolResource",
"parameters": [],
@@ -7431,13 +7584,15 @@
"name": "withToolSource",
"capabilityId": "Aspire.Hosting/withToolSource",
"qualifiedName": "withToolSource",
- "description": "Adds a NuGet source for the tool",
+ "description": "Adds a NuGet package source for tool acquisition.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolSource(source: string): DotnetToolResource",
"parameters": [
{
"name": "source",
- "type": "string"
+ "type": "string",
+ "description": "The source to add."
}
],
"returnType": "DotnetToolResource",
@@ -7451,13 +7606,15 @@
"name": "withToolVersion",
"capabilityId": "Aspire.Hosting/withToolVersion",
"qualifiedName": "withToolVersion",
- "description": "Sets the tool version",
+ "description": "Sets the package version for a tool to use.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolVersion(version: string): DotnetToolResource",
"parameters": [
{
"name": "version",
- "type": "string"
+ "type": "string",
+ "description": "The package version to use"
}
],
"returnType": "DotnetToolResource",
@@ -7503,19 +7660,23 @@
"name": "withUrlForEndpoint",
"capabilityId": "Aspire.Hosting/withUrlForEndpoint",
"qualifiedName": "withUrlForEndpoint",
- "description": "Customizes the URL for a specific endpoint via callback",
+ "description": "Registers a callback to update the URL displayed for the endpoint with the specified name.",
+ "remarks": "Use this method to customize the URL that is automatically added for an endpoint on the resource.\nTo add another URL for an endpoint, use `WithUrlForEndpoint``1`.\nThe callback will be executed after endpoints have been allocated and the URL has been generated.\nThis allows you to modify the URL or its display text.\nIf the URL returned by `callback` is relative, it will be combined with the endpoint URL to create an absolute URL.\nIf the endpoint with the specified name does not exist, the callback will not be executed and a warning will be logged.\nCustomize the URL for the \"https\" endpoint to use the link text \"Home\":\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrlForEndpoint(\"https\", url => url.DisplayText = \"Home\");\n```\nCustomize the URL for the \"https\" endpoint to deep to the \"/home\" path:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrlForEndpoint(\"https\", url => url.Url = \"/home\");\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withUrlForEndpoint(endpointName: string, callback: (obj: ResourceUrlAnnotation) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withUrlForEndpoint(endpointName: string, callback: (obj: ResourceUrlAnnotation) => Promise): IResource",
"parameters": [
{
"name": "endpointName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint to customize the URL for."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ResourceUrlAnnotation) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ResourceUrlAnnotation) => Promise",
+ "description": "The callback that will customize the URL."
}
],
"returnType": "IResource",
@@ -7536,15 +7697,18 @@
"name": "withUrls",
"capabilityId": "Aspire.Hosting/withUrls",
"qualifiedName": "withUrls",
- "description": "Customizes displayed URLs via callback",
+ "description": "Registers a callback to customize the URLs displayed for the resource.",
+ "remarks": "The callback will be executed after endpoints have been allocated for this resource.\nThis allows you to modify any URLs for the resource, including adding, modifying, or even deletion.\nNote that any endpoints on the resource will automatically get a corresponding URL added for them.\nUpdate all displayed URLs to have display text:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrls(c =>\n{\nforeach (var url in c.Urls)\n{\nif (string.IsNullOrEmpty(url.DisplayText))\n{\nurl.DisplayText = \"frontend\";\n}\n}\n});\n```\nUpdate endpoint URLs to use a custom host name based on the resource name:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrls(c =>\n{\nforeach (var url in c.Urls)\n{\nif (url.Endpoint is not null)\n{\nvar uri = new UriBuilder(url.Url) { Host = $\"{c.Resource.Name}.localhost\" };\nurl.Url = uri.ToString();\n}\n}\n});\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withUrls(callback: (obj: ResourceUrlsCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withUrls(callback: (obj: ResourceUrlsCallbackContext) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ResourceUrlsCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ResourceUrlsCallbackContext) => Promise",
+ "description": "The callback that will customize URLs for the resource."
}
],
"returnType": "IResource",
@@ -7565,24 +7729,29 @@
"name": "withVolume",
"capabilityId": "Aspire.Hosting/withVolume",
"qualifiedName": "withVolume",
- "description": "Adds a volume",
+ "description": "Adds a volume to a container resource.",
+ "remarks": "Volumes persist data across container restarts. Named volumes are managed\nby Docker/Podman and stored in a system-managed location.\nWhy this wrapper exists: The original `ContainerResourceBuilderExtensions.WithVolume`\nhas parameter order `(name?, target, isReadOnly)` where the optional `name` comes first.\nThis wrapper reorders parameters to `(target, name?, isReadOnly)` so the required `target`\nparameter comes first, providing a better API for polyglot consumers.",
+ "returns": "The same resource builder handle for chaining.",
"kind": "Method",
"signature": "withVolume(target: string, name?: string, isReadOnly?: boolean): ContainerResource",
"parameters": [
{
"name": "target",
- "type": "string"
+ "type": "string",
+ "description": "The mount path inside the container."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The volume name. If null, an anonymous volume is created."
},
{
"name": "isReadOnly",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "Whether the volume is read-only."
}
],
"returnType": "ContainerResource",
@@ -7596,13 +7765,15 @@
"name": "withWorkingDirectory",
"capabilityId": "Aspire.Hosting/withWorkingDirectory",
"qualifiedName": "withWorkingDirectory",
- "description": "Sets the executable working directory",
+ "description": "Sets the working directory for the executable resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withWorkingDirectory(workingDirectory: string): ExecutableResource",
"parameters": [
{
"name": "workingDirectory",
- "type": "string"
+ "type": "string",
+ "description": "Working directory."
}
],
"returnType": "ExecutableResource",
@@ -7639,6 +7810,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is published after all resources have been created.",
+ "remarks": "Subscribing to this event is analogous to implementing the `AfterResourcesCreatedAsync`\nmethod. This event provides access to the `IServiceProvider` interface to resolve dependencies including\n`DistributedApplicationModel` service which is passed in as an argument\nin `AfterResourcesCreatedAsync`.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent"
],
@@ -7647,7 +7820,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.model",
"qualifiedName": "AfterResourcesCreatedEvent.model",
- "description": "Gets the Model property",
+ "description": "The `DistributedApplicationModel` instance.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -7661,7 +7834,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.services",
"qualifiedName": "AfterResourcesCreatedEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` instance.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -7678,6 +7851,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is raised by orchestrators before they have started a new resource.",
+ "remarks": "Resources that are created by orchestrators may not yet be ready to handle requests.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -7718,6 +7893,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.BeforeStartEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is published before the application starts.",
+ "remarks": "Subscribing to this event is analogous to implementing the `BeforeStartAsync`\nmethod. This event provides access to the `IServiceProvider` interface to resolve dependencies including\n`DistributedApplicationModel` service which is passed in as an argument\nin `BeforeStartAsync`.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent"
],
@@ -7726,7 +7903,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.ApplicationModel/BeforeStartEvent.model",
"qualifiedName": "BeforeStartEvent.model",
- "description": "Gets the Model property",
+ "description": "The `DistributedApplicationModel` instance.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -7740,7 +7917,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/BeforeStartEvent.services",
"qualifiedName": "BeforeStartEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` instance.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -7756,13 +7933,14 @@
"name": "CommandLineArgsCallbackContext",
"fullName": "Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext",
"kind": "handle",
+ "description": "Represents a callback context for the list of command-line arguments associated with an executable resource.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "args",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.args",
"qualifiedName": "CommandLineArgsCallbackContext.args",
- "description": "Gets the command-line argument editor",
+ "description": "Gets the editor used to manipulate command-line arguments in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "args(): CommandLineArgsEditor",
"parameters": [],
@@ -7776,7 +7954,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.executionContext",
"qualifiedName": "CommandLineArgsCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this callback.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -7790,7 +7968,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.log",
"qualifiedName": "CommandLineArgsCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -7804,7 +7982,8 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.resource",
"qualifiedName": "CommandLineArgsCallbackContext.resource",
- "description": "Gets the resource associated with this callback",
+ "description": "The resource associated with this callback context.",
+ "remarks": "This will be set to the resource in all cases where Aspire invokes the callback.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -7820,19 +7999,21 @@
"name": "CommandLineArgsEditor",
"fullName": "Aspire.Hosting.ApplicationModel.CommandLineArgsEditor",
"kind": "handle",
+ "description": "Provides an ATS-first editor for command-line arguments within polyglot callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "add",
"capabilityId": "Aspire.Hosting.ApplicationModel/add",
"qualifiedName": "CommandLineArgsEditor.add",
- "description": "Adds a command-line argument",
+ "description": "Adds a command-line argument.",
"kind": "InstanceMethod",
"signature": "add(value: IExpressionValue): void",
"parameters": [
{
"name": "value",
- "type": "IExpressionValue"
+ "type": "IExpressionValue",
+ "description": "The argument to add."
}
],
"returnType": "void",
@@ -7848,6 +8029,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "The `ConnectionStringAvailableEvent` is raised when a connection string becomes available for a resource.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -7888,13 +8070,15 @@
"fullName": "Aspire.Hosting.ApplicationModel.ContainerImagePushOptions",
"kind": "handle",
"exposeProperties": true,
+ "description": "Represents options for pushing container images to a registry.",
+ "remarks": "This class allows customization of how container images are named and tagged when pushed to a container registry.\nThe `RemoteImageName` specifies the repository path (without registry endpoint or tag),\nand `RemoteImageTag` specifies the tag to apply. Use `GetFullRemoteImageNameAsync`\nto construct the complete image reference including registry endpoint and tag.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "remoteImageName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.remoteImageName",
"qualifiedName": "ContainerImagePushOptions.remoteImageName",
- "description": "Gets the RemoteImageName property",
+ "description": "Gets or sets the remote image name (repository path without registry endpoint or tag).",
"kind": "PropertyGetter",
"signature": "remoteImageName(): string",
"parameters": [],
@@ -7908,7 +8092,7 @@
"name": "remoteImageTag",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.remoteImageTag",
"qualifiedName": "ContainerImagePushOptions.remoteImageTag",
- "description": "Gets the RemoteImageTag property",
+ "description": "Gets or sets the remote image tag.",
"kind": "PropertyGetter",
"signature": "remoteImageTag(): string",
"parameters": [],
@@ -7922,7 +8106,7 @@
"name": "setRemoteImageName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.setRemoteImageName",
"qualifiedName": "ContainerImagePushOptions.setRemoteImageName",
- "description": "Sets the RemoteImageName property",
+ "description": "Gets or sets the remote image name (repository path without registry endpoint or tag).",
"kind": "PropertySetter",
"signature": "setRemoteImageName(value: string): ContainerImagePushOptions",
"parameters": [
@@ -7941,7 +8125,7 @@
"name": "setRemoteImageTag",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptions.setRemoteImageTag",
"qualifiedName": "ContainerImagePushOptions.setRemoteImageTag",
- "description": "Sets the RemoteImageTag property",
+ "description": "Gets or sets the remote image tag.",
"kind": "PropertySetter",
"signature": "setRemoteImageTag(value: string): ContainerImagePushOptions",
"parameters": [
@@ -7963,13 +8147,15 @@
"fullName": "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides context information for container image push options callbacks.",
+ "remarks": "This context is passed to callbacks registered via `WithImagePushOptions``1`.\nCallbacks can use this context to access the resource being configured and modify the `Options`\nto customize how the container image is named and tagged when pushed to a registry.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.cancellationToken",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token to observe while configuring image push options.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -7983,7 +8169,7 @@
"name": "options",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.options",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.options",
- "description": "Gets the Options property",
+ "description": "Gets the container image push options that can be modified by the callback.",
"kind": "PropertyGetter",
"signature": "options(): ContainerImagePushOptions",
"parameters": [],
@@ -7997,7 +8183,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.resource",
"qualifiedName": "ContainerImagePushOptionsCallbackContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource being configured for container image push operations.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -8006,63 +8192,6 @@
"expandedTargetTypes": [
"Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
]
- },
- {
- "name": "setCancellationToken",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setCancellationToken",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
- "kind": "PropertySetter",
- "signature": "setCancellationToken(value: cancellationToken): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "cancellationToken"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
- },
- {
- "name": "setOptions",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setOptions",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setOptions",
- "description": "Sets the Options property",
- "kind": "PropertySetter",
- "signature": "setOptions(value: ContainerImagePushOptions): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "ContainerImagePushOptions"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
- },
- {
- "name": "setResource",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ContainerImagePushOptionsCallbackContext.setResource",
- "qualifiedName": "ContainerImagePushOptionsCallbackContext.setResource",
- "description": "Sets the Resource property",
- "kind": "PropertySetter",
- "signature": "setResource(value: IResource): ContainerImagePushOptionsCallbackContext",
- "parameters": [
- {
- "name": "value",
- "type": "IResource"
- }
- ],
- "returnType": "ContainerImagePushOptionsCallbackContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ContainerImagePushOptionsCallbackContext"
- ]
}
]
},
@@ -8071,6 +8200,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.ContainerImageReference",
"kind": "handle",
"exposeProperties": true,
+ "description": "Represents the fully‑qualified container image reference that should be deployed.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
"Aspire.Hosting.ApplicationModel.IValueProvider",
@@ -8083,6 +8213,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.ContainerMountAnnotation",
"kind": "handle",
"exposeProperties": true,
+ "description": "Represents a mount annotation for a container resource.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IResourceAnnotation"
],
@@ -8093,6 +8224,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.ContainerPortReference",
"kind": "handle",
"exposeProperties": true,
+ "description": "Represents a TCP/UDP port that a container can expose.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
"Aspire.Hosting.ApplicationModel.IValueProvider",
@@ -8114,6 +8246,7 @@
"name": "ContainerResource",
"fullName": "Aspire.Hosting.ApplicationModel.ContainerResource",
"kind": "handle",
+ "description": "A resource that represents a specified container.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IComputeResource",
"Aspire.Hosting.ApplicationModel.IResource",
@@ -8128,7 +8261,8 @@
"name": "publishAsConnectionString",
"capabilityId": "Aspire.Hosting/publishAsConnectionString",
"qualifiedName": "publishAsConnectionString",
- "description": "Publishes the resource as a connection string",
+ "description": "Changes the resource to be published as a connection string reference in the manifest.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsConnectionString(): ContainerResource",
"parameters": [],
@@ -8143,7 +8277,8 @@
"name": "publishAsContainer",
"capabilityId": "Aspire.Hosting/publishAsContainer",
"qualifiedName": "publishAsContainer",
- "description": "Configures the resource to be published as a container",
+ "description": "Changes the resource to be published as a container in the manifest.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsContainer(): ContainerResource",
"parameters": [],
@@ -8158,23 +8293,28 @@
"name": "withBindMount",
"capabilityId": "Aspire.Hosting/withBindMount",
"qualifiedName": "withBindMount",
- "description": "Adds a bind mount",
+ "description": "Adds a bind mount to a container resource.",
+ "remarks": "Bind mounts are used to mount files or directories from the host file-system into the container. If the host doesn't require access to the files, consider\nusing volumes instead via `WithVolume``1`.\nThe `source` path specifies the path of the file or directory on the host that will be mounted in the container. If the path is not absolute,\nit will be evaluated relative to the app host project directory path.\nThe `target` path specifies the path the file or directory will be mounted inside the container's file system.\nAdds a bind mount that will mount the `config` directory in the app host project directory, to the container's file system at the path `/database/config`,\nand mark it read-only so that the container cannot modify it:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithBindMount(\"./config\", \"/database/config\", isReadOnly: true);\nbuilder.Build().Run();\n```\nAdds a bind mount that will mount the `init.sh` file from a directory outside the app host project directory, to the container's file system at the path `/usr/config/initialize.sh`,\nand mark it read-only so that the container cannot modify it:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithBindMount(\"../containerconfig/scripts/init.sh\", \"/usr/config/initialize.sh\", isReadOnly: true);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBindMount(source: string, target: string, isReadOnly?: boolean): ContainerResource",
"parameters": [
{
"name": "source",
- "type": "string"
+ "type": "string",
+ "description": "The source path of the mount. This is the path to the file or directory on the host, relative to the app host project directory."
},
{
"name": "target",
- "type": "string"
+ "type": "string",
+ "description": "The target path where the file or directory is mounted in the container."
},
{
"name": "isReadOnly",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "A flag that indicates if this is a read-only mount."
}
],
"returnType": "ContainerResource",
@@ -8188,17 +8328,20 @@
"name": "withBuildArg",
"capabilityId": "Aspire.Hosting/withBuildArg",
"qualifiedName": "withBuildArg",
- "description": "Adds a build argument from a string value or parameter resource",
+ "description": "Adds a build argument when the container is built from a Dockerfile.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBuildArg(name: string, value: ParameterResource): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the build argument."
},
{
"name": "value",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The build argument value, either a string or a parameter resource."
}
],
"returnType": "ContainerResource",
@@ -8212,17 +8355,21 @@
"name": "withBuildSecret",
"capabilityId": "Aspire.Hosting/withParameterBuildSecret",
"qualifiedName": "withBuildSecret",
- "description": "Adds a build secret from a parameter resource",
+ "description": "Adds a secret build argument when the container is built from a Dockerfile.",
+ "remarks": "The `WithBuildSecret``1` extension method\nresults in a `--secret` argument being appended to the `docker build` or `podman build` command. This overload results in an environment\nvariable-based secret being passed to the build process. The value of the environment variable is the value of the secret referenced by the `ParameterResource`.\nAdding a build secret based on a parameter.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar accessToken = builder.AddParameter(\"accessToken\", secret: true);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfile(\"../mycontainer\")\n.WithBuildSecret(\"ACCESS_TOKEN\", accessToken);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withBuildSecret(name: string, value: ParameterResource): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret build argument."
},
{
"name": "value",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The resource builder for a parameter resource."
}
],
"returnType": "ContainerResource",
@@ -8236,24 +8383,28 @@
"name": "withContainerCertificatePaths",
"capabilityId": "Aspire.Hosting/withContainerCertificatePaths",
"qualifiedName": "withContainerCertificatePaths",
- "description": "Overrides container certificate bundle and directory paths used for trust configuration",
+ "description": "Adds container certificate path overrides used for certificate trust at run time.",
+ "returns": "The updated resource builder.",
"kind": "Method",
"signature": "withContainerCertificatePaths(customCertificatesDestination?: string, defaultCertificateBundlePaths?: string[], defaultCertificateDirectoryPaths?: string[]): ContainerResource",
"parameters": [
{
"name": "customCertificatesDestination",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The destination path in the container where custom certificates will be copied."
},
{
"name": "defaultCertificateBundlePaths",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Default certificate bundle paths in the container that will be replaced."
},
{
"name": "defaultCertificateDirectoryPaths",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Default certificate directory paths in the container that may be appended."
}
],
"returnType": "ContainerResource",
@@ -8267,13 +8418,16 @@
"name": "withContainerName",
"capabilityId": "Aspire.Hosting/withContainerName",
"qualifiedName": "withContainerName",
- "description": "Sets the container name",
+ "description": "Overrides the default container name for this resource. By default Aspire generates a unique container name based on the resource name and a random postfix (or a postfix based on a hash of the AppHost project path for persistent container resources). This method allows you to override that behavior with a custom name, but could lead to naming conflicts if the specified name is not unique.",
+ "remarks": "Combining this with `Persistent` will allow Aspire to re-use an existing container that was not\ncreated by an Aspire AppHost.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerName(name: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The desired container name. Must be a valid container name or your runtime will report an error."
}
],
"returnType": "ContainerResource",
@@ -8287,13 +8441,16 @@
"name": "withContainerNetworkAlias",
"capabilityId": "Aspire.Hosting/withContainerNetworkAlias",
"qualifiedName": "withContainerNetworkAlias",
- "description": "Adds a network alias for the container",
+ "description": "Adds a network alias to container resource.",
+ "remarks": "Network aliases enable DNS resolution of the container on the network by custom names.\nBy default, containers are accessible on the network using their resource name as a DNS alias.\nThis method allows adding additional aliases for the same container.\nMultiple aliases can be added by calling this method multiple times.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerNetworkAlias(alias: string): ContainerResource",
"parameters": [
{
"name": "alias",
- "type": "string"
+ "type": "string",
+ "description": "The network alias for the container."
}
],
"returnType": "ContainerResource",
@@ -8307,13 +8464,16 @@
"name": "withContainerRuntimeArgs",
"capabilityId": "Aspire.Hosting/withContainerRuntimeArgs",
"qualifiedName": "withContainerRuntimeArgs",
- "description": "Adds runtime arguments for the container",
+ "description": "Adds a callback to be executed with a list of arguments to add to the container runtime run command when a container resource is started.",
+ "remarks": "This is intended to pass additional arguments to the underlying container runtime run command to enable advanced features such as exposing GPUs to the container. To pass runtime arguments to the actual container, use the `WithArgs``1` method.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withContainerRuntimeArgs(args: string[]): ContainerResource",
"parameters": [
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to be passed to the container runtime run command when the container resource is started."
}
],
"returnType": "ContainerResource",
@@ -8327,23 +8487,28 @@
"name": "withDockerfile",
"capabilityId": "Aspire.Hosting/withDockerfile",
"qualifiedName": "withDockerfile",
- "description": "Configures the resource to use a Dockerfile",
+ "description": "Causes Aspire to build the specified container image from a Dockerfile.",
+ "remarks": "When this method is called an annotation is added to the `ContainerResource` that specifies the context path and\nDockerfile path to be used when building the container image. These details are then used by the orchestrator to build the image\nbefore using that image to start the container.\nThe `contextPath` is relative to the AppHost directory unless it is a fully qualified path.\nThe `dockerfilePath` is relative to the `contextPath` unless it is a fully qualified path.\nIf the `dockerfilePath` is not provided, it defaults to \"Dockerfile\" in the `contextPath`.\nWhen generating the manifest for deployment tools, the `WithDockerfile``1`\nmethod results in an additional attribute being added to the `container.v0` resource type which contains the configuration\nnecessary to allow the deployment tool to build the container image prior to deployment.\nCreates a container called `mycontainer` with an image called `myimage`.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfile(\"path/to/context\");\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDockerfile(contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource",
"parameters": [
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "dockerfilePath",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Path to the Dockerfile relative to the `contextPath`. Defaults to \"Dockerfile\" if not specified."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -8357,24 +8522,29 @@
"name": "withDockerfileBuilder",
"capabilityId": "Aspire.Hosting/withDockerfileBuilder",
"qualifiedName": "withDockerfileBuilder",
- "description": "Configures the resource to use a programmatically generated Dockerfile",
+ "description": "Builds the specified container image from a Dockerfile generated by a callback using the `DockerfileBuilder` API.",
+ "remarks": "This method provides a programmatic way to build Dockerfiles using the `DockerfileBuilder` API\ninstead of string manipulation. Callbacks can be composed by calling this method multiple times - each callback will be invoked\nin order to build up the final Dockerfile.\nThe `contextPath` is relative to the AppHost directory unless it is fully qualified.\nCreates a container with a programmatically built Dockerfile using fluent API:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithDockerfileBuilder(\"path/to/context\", context =>\n{\ncontext.Builder.From(\"alpine:latest\")\n.WorkDir(\"/app\")\n.Run(\"apk add curl\")\n.Copy(\".\", \".\")\n.Cmd([\"./myapp\"]);\nreturn Task.CompletedTask;\n});\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withDockerfileBuilder(contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E, stage?: string): ContainerResource",
+ "signature": "withDockerfileBuilder(contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) => Promise, stage?: string): ContainerResource",
"parameters": [
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: DockerfileBuilderCallbackContext) => Promise",
+ "description": "A callback that uses the `DockerfileBuilder` API to construct the Dockerfile."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -8388,13 +8558,16 @@
"name": "withEndpointProxySupport",
"capabilityId": "Aspire.Hosting/withEndpointProxySupport",
"qualifiedName": "withEndpointProxySupport",
- "description": "Configures endpoint proxy support",
+ "description": "Set whether a container resource can use proxied endpoints or whether they should be disabled for all endpoints belonging to the container. If set to `false`, endpoints belonging to the container resource will ignore the configured proxy settings and run proxy-less.",
+ "remarks": "This method is intended to support scenarios with persistent lifetime containers where it is desirable for the container to be accessible over the same\nport whether the Aspire application is running or not. Proxied endpoints bind ports that are only accessible while the Aspire application is running.\nThe user needs to be careful to ensure that container endpoints are using unique ports when disabling proxy support as by default for proxy-less\nendpoints, Aspire will allocate the internal container port as the host port, which will increase the chance of port conflicts.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEndpointProxySupport(proxyEnabled: boolean): ContainerResource",
"parameters": [
{
"name": "proxyEnabled",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Should endpoints for the container resource support using a proxy?"
}
],
"returnType": "ContainerResource",
@@ -8408,13 +8581,15 @@
"name": "withEntrypoint",
"capabilityId": "Aspire.Hosting/withEntrypoint",
"qualifiedName": "withEntrypoint",
- "description": "Sets the container entrypoint",
+ "description": "Sets the Entrypoint for the container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEntrypoint(entrypoint: string): ContainerResource",
"parameters": [
{
"name": "entrypoint",
- "type": "string"
+ "type": "string",
+ "description": "The new entrypoint for the container."
}
],
"returnType": "ContainerResource",
@@ -8428,18 +8603,21 @@
"name": "withImage",
"capabilityId": "Aspire.Hosting/withImage",
"qualifiedName": "withImage",
- "description": "Sets the container image",
+ "description": "Allows overriding the image on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImage(image: string, tag?: string): ContainerResource",
"parameters": [
{
"name": "image",
- "type": "string"
+ "type": "string",
+ "description": "Image value."
},
{
"name": "tag",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Tag value."
}
],
"returnType": "ContainerResource",
@@ -8453,13 +8631,15 @@
"name": "withImagePullPolicy",
"capabilityId": "Aspire.Hosting/withImagePullPolicy",
"qualifiedName": "withImagePullPolicy",
- "description": "Sets the container image pull policy",
+ "description": "Sets the pull policy for the container resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImagePullPolicy(pullPolicy: ImagePullPolicy): ContainerResource",
"parameters": [
{
"name": "pullPolicy",
- "type": "ImagePullPolicy"
+ "type": "ImagePullPolicy",
+ "description": "The pull policy behavior for the container resource."
}
],
"returnType": "ContainerResource",
@@ -8473,13 +8653,15 @@
"name": "withImageRegistry",
"capabilityId": "Aspire.Hosting/withImageRegistry",
"qualifiedName": "withImageRegistry",
- "description": "Sets the container image registry",
+ "description": "Allows overriding the image registry on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageRegistry(registry: string): ContainerResource",
"parameters": [
{
"name": "registry",
- "type": "string"
+ "type": "string",
+ "description": "Registry value."
}
],
"returnType": "ContainerResource",
@@ -8493,13 +8675,15 @@
"name": "withImageSHA256",
"capabilityId": "Aspire.Hosting/withImageSHA256",
"qualifiedName": "withImageSHA256",
- "description": "Sets the image SHA256 digest",
+ "description": "Allows setting the image to a specific sha256 on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageSHA256(sha256: string): ContainerResource",
"parameters": [
{
"name": "sha256",
- "type": "string"
+ "type": "string",
+ "description": "Registry value."
}
],
"returnType": "ContainerResource",
@@ -8513,13 +8697,15 @@
"name": "withImageTag",
"capabilityId": "Aspire.Hosting/withImageTag",
"qualifiedName": "withImageTag",
- "description": "Sets the container image tag",
+ "description": "Allows overriding the image tag on a container.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withImageTag(tag: string): ContainerResource",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "Tag value."
}
],
"returnType": "ContainerResource",
@@ -8533,13 +8719,16 @@
"name": "withLifetime",
"capabilityId": "Aspire.Hosting/withLifetime",
"qualifiedName": "withLifetime",
- "description": "Sets the lifetime behavior of the container resource",
+ "description": "Sets the lifetime behavior of the container resource.",
+ "remarks": "Marking a container resource to have a `Persistent` lifetime.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddContainer(\"mycontainer\", \"myimage\")\n.WithLifetime(ContainerLifetime.Persistent);\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withLifetime(lifetime: ContainerLifetime): ContainerResource",
"parameters": [
{
"name": "lifetime",
- "type": "ContainerLifetime"
+ "type": "ContainerLifetime",
+ "description": "The lifetime behavior of the container resource. The defaults behavior is `Session`."
}
],
"returnType": "ContainerResource",
@@ -8553,24 +8742,29 @@
"name": "withVolume",
"capabilityId": "Aspire.Hosting/withVolume",
"qualifiedName": "withVolume",
- "description": "Adds a volume",
+ "description": "Adds a volume to a container resource.",
+ "remarks": "Volumes persist data across container restarts. Named volumes are managed\nby Docker/Podman and stored in a system-managed location.\nWhy this wrapper exists: The original `ContainerResourceBuilderExtensions.WithVolume`\nhas parameter order `(name?, target, isReadOnly)` where the optional `name` comes first.\nThis wrapper reorders parameters to `(target, name?, isReadOnly)` so the required `target`\nparameter comes first, providing a better API for polyglot consumers.",
+ "returns": "The same resource builder handle for chaining.",
"kind": "Method",
"signature": "withVolume(target: string, name?: string, isReadOnly?: boolean): ContainerResource",
"parameters": [
{
"name": "target",
- "type": "string"
+ "type": "string",
+ "description": "The mount path inside the container."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The volume name. If null, an anonymous volume is created."
},
{
"name": "isReadOnly",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "Whether the volume is read-only."
}
],
"returnType": "ContainerResource",
@@ -8603,19 +8797,22 @@
"name": "DistributedApplicationModel",
"fullName": "Aspire.Hosting.ApplicationModel.DistributedApplicationModel",
"kind": "handle",
+ "description": "Represents a distributed application.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "findResourceByName",
"capabilityId": "Aspire.Hosting/findResourceByName",
"qualifiedName": "findResourceByName",
- "description": "Finds a resource by name",
+ "description": "Finds a resource by name.",
+ "returns": "The matching resource, or `null` when not found.",
"kind": "Method",
"signature": "findResourceByName(name: string): IResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The resource name."
}
],
"returnType": "IResource",
@@ -8628,7 +8825,8 @@
"name": "getResources",
"capabilityId": "Aspire.Hosting/getResources",
"qualifiedName": "getResources",
- "description": "Gets resources from the distributed application model",
+ "description": "Gets all resources in the distributed application model.",
+ "returns": "The resources in the model.",
"kind": "Method",
"signature": "getResources(): IResource[]",
"parameters": [],
@@ -8644,6 +8842,7 @@
"name": "DockerfileBuilder",
"fullName": "Aspire.Hosting.ApplicationModel.Docker.DockerfileBuilder",
"kind": "handle",
+ "description": "Builder for creating Dockerfiles programmatically.",
"implementedInterfaces": [],
"capabilities": [
{
@@ -8724,6 +8923,7 @@
"name": "DockerfileStage",
"fullName": "Aspire.Hosting.ApplicationModel.Docker.DockerfileStage",
"kind": "handle",
+ "description": "Represents a stage within a multi-stage Dockerfile.",
"implementedInterfaces": [],
"capabilities": [
{
@@ -9038,13 +9238,14 @@
"fullName": "Aspire.Hosting.ApplicationModel.DockerfileBuilderCallbackContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides context information for Dockerfile build callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "builder",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.builder",
"qualifiedName": "DockerfileBuilderCallbackContext.builder",
- "description": "Gets the Builder property",
+ "description": "Gets the Dockerfile builder instance.",
"kind": "PropertyGetter",
"signature": "builder(): DockerfileBuilder",
"parameters": [],
@@ -9058,7 +9259,7 @@
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.cancellationToken",
"qualifiedName": "DockerfileBuilderCallbackContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token to observe while waiting for the task to complete.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -9072,7 +9273,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.resource",
"qualifiedName": "DockerfileBuilderCallbackContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource being built.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -9086,7 +9287,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/DockerfileBuilderCallbackContext.services",
"qualifiedName": "DockerfileBuilderCallbackContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency injection.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -9116,7 +9317,8 @@
"name": "withToolIgnoreExistingFeeds",
"capabilityId": "Aspire.Hosting/withToolIgnoreExistingFeeds",
"qualifiedName": "withToolIgnoreExistingFeeds",
- "description": "Ignores existing NuGet feeds",
+ "description": "Configures the tool to use only the specified package sources, ignoring existing NuGet configuration.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolIgnoreExistingFeeds(): DotnetToolResource",
"parameters": [],
@@ -9131,7 +9333,8 @@
"name": "withToolIgnoreFailedSources",
"capabilityId": "Aspire.Hosting/withToolIgnoreFailedSources",
"qualifiedName": "withToolIgnoreFailedSources",
- "description": "Ignores failed NuGet sources",
+ "description": "Configures the resource to treat package source failures as warnings.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolIgnoreFailedSources(): DotnetToolResource",
"parameters": [],
@@ -9146,13 +9349,15 @@
"name": "withToolPackage",
"capabilityId": "Aspire.Hosting/withToolPackage",
"qualifiedName": "withToolPackage",
- "description": "Sets the tool package ID",
+ "description": "Sets the package identifier for the tool configuration associated with the resource builder.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolPackage(packageId: string): DotnetToolResource",
"parameters": [
{
"name": "packageId",
- "type": "string"
+ "type": "string",
+ "description": "The package identifier to assign to the tool configuration. Cannot be null."
}
],
"returnType": "DotnetToolResource",
@@ -9166,7 +9371,8 @@
"name": "withToolPrerelease",
"capabilityId": "Aspire.Hosting/withToolPrerelease",
"qualifiedName": "withToolPrerelease",
- "description": "Allows prerelease tool versions",
+ "description": "Allows prerelease versions of the tool to be used",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolPrerelease(): DotnetToolResource",
"parameters": [],
@@ -9181,13 +9387,15 @@
"name": "withToolSource",
"capabilityId": "Aspire.Hosting/withToolSource",
"qualifiedName": "withToolSource",
- "description": "Adds a NuGet source for the tool",
+ "description": "Adds a NuGet package source for tool acquisition.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolSource(source: string): DotnetToolResource",
"parameters": [
{
"name": "source",
- "type": "string"
+ "type": "string",
+ "description": "The source to add."
}
],
"returnType": "DotnetToolResource",
@@ -9201,13 +9409,15 @@
"name": "withToolVersion",
"capabilityId": "Aspire.Hosting/withToolVersion",
"qualifiedName": "withToolVersion",
- "description": "Sets the tool version",
+ "description": "Sets the package version for a tool to use.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withToolVersion(version: string): DotnetToolResource",
"parameters": [
{
"name": "version",
- "type": "string"
+ "type": "string",
+ "description": "The package version to use"
}
],
"returnType": "DotnetToolResource",
@@ -9223,6 +9433,7 @@
"name": "EndpointReference",
"fullName": "Aspire.Hosting.ApplicationModel.EndpointReference",
"kind": "handle",
+ "description": "Represents an endpoint reference for a resource with endpoints.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IExpressionValue",
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
@@ -9234,7 +9445,7 @@
"name": "endpointName",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.endpointName",
"qualifiedName": "EndpointReference.endpointName",
- "description": "Gets the EndpointName property",
+ "description": "Gets the name of the endpoint associated with the endpoint reference.",
"kind": "PropertyGetter",
"signature": "endpointName(): string",
"parameters": [],
@@ -9248,7 +9459,7 @@
"name": "errorMessage",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.errorMessage",
"qualifiedName": "EndpointReference.errorMessage",
- "description": "Gets the ErrorMessage property",
+ "description": "Gets or sets a custom error message to be thrown when the endpoint annotation is not found.",
"kind": "PropertyGetter",
"signature": "errorMessage(): string",
"parameters": [],
@@ -9262,7 +9473,8 @@
"name": "excludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.excludeReferenceEndpoint",
"qualifiedName": "EndpointReference.excludeReferenceEndpoint",
- "description": "Gets the ExcludeReferenceEndpoint property",
+ "description": "Gets a value indicating whether this endpoint is excluded from the default set when referencing the resource's endpoints.",
+ "remarks": "Returns `false` if the endpoint annotation has not been added to the resource yet.\nOnce the annotation exists, this property delegates to `ExcludeReferenceEndpoint`.",
"kind": "PropertyGetter",
"signature": "excludeReferenceEndpoint(): boolean",
"parameters": [],
@@ -9276,7 +9488,7 @@
"name": "exists",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.exists",
"qualifiedName": "EndpointReference.exists",
- "description": "Gets the Exists property",
+ "description": "Gets a value indicating whether the endpoint exists.",
"kind": "PropertyGetter",
"signature": "exists(): boolean",
"parameters": [],
@@ -9290,17 +9502,21 @@
"name": "getTlsValue",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.getTlsValue",
"qualifiedName": "EndpointReference.getTlsValue",
- "description": "Gets a conditional expression that resolves to the enabledValue when TLS is enabled on the endpoint, or to the disabledValue otherwise.",
+ "description": "Creates a conditional `ReferenceExpression` that resolves to `enabledValue` when `TlsEnabled` is `true` on this endpoint, or to `disabledValue` otherwise.",
+ "remarks": "The returned expression evaluates the TLS state lazily each time its value is resolved, making it\nsafe to embed in a `ReferenceExpression` that is built before TLS is configured\n(e.g., before `BeforeStartEvent` fires). Because the condition and branches are declarative,\npolyglot code generators can translate this into native conditional constructs in any target language.",
+ "returns": "A conditional `ReferenceExpression` whose value tracks the TLS state of this endpoint.",
"kind": "InstanceMethod",
"signature": "getTlsValue(enabledValue: ReferenceExpression, disabledValue: ReferenceExpression): ReferenceExpression",
"parameters": [
{
"name": "enabledValue",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The expression to evaluate when TLS is enabled (e.g., `\",ssl=true\"`)."
},
{
"name": "disabledValue",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The expression to evaluate when TLS is not enabled."
}
],
"returnType": "ReferenceExpression",
@@ -9313,14 +9529,16 @@
"name": "getValueAsync",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.getValueAsync",
"qualifiedName": "EndpointReference.getValueAsync",
- "description": "Gets the URL of the endpoint asynchronously",
+ "description": "Gets the URL of the endpoint asynchronously. Waits for the endpoint to be allocated if necessary.",
+ "returns": "The URL of the endpoint.",
"kind": "InstanceMethod",
"signature": "getValueAsync(cancellationToken?: cancellationToken): string",
"parameters": [
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The cancellation token."
}
],
"returnType": "string",
@@ -9333,7 +9551,7 @@
"name": "host",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.host",
"qualifiedName": "EndpointReference.host",
- "description": "Gets the Host property",
+ "description": "Gets the host for this endpoint.",
"kind": "PropertyGetter",
"signature": "host(): string",
"parameters": [],
@@ -9347,7 +9565,7 @@
"name": "isAllocated",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isAllocated",
"qualifiedName": "EndpointReference.isAllocated",
- "description": "Gets the IsAllocated property",
+ "description": "Gets a value indicating whether the endpoint is allocated.",
"kind": "PropertyGetter",
"signature": "isAllocated(): boolean",
"parameters": [],
@@ -9361,7 +9579,7 @@
"name": "isHttp",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttp",
"qualifiedName": "EndpointReference.isHttp",
- "description": "Gets the IsHttp property",
+ "description": "Gets a value indicating whether the endpoint uses HTTP scheme.",
"kind": "PropertyGetter",
"signature": "isHttp(): boolean",
"parameters": [],
@@ -9375,7 +9593,7 @@
"name": "isHttps",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttps",
"qualifiedName": "EndpointReference.isHttps",
- "description": "Gets the IsHttps property",
+ "description": "Gets a value indicating whether the endpoint uses HTTPS scheme.",
"kind": "PropertyGetter",
"signature": "isHttps(): boolean",
"parameters": [],
@@ -9389,7 +9607,7 @@
"name": "isHttpSchemeNamedEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.isHttpSchemeNamedEndpoint",
"qualifiedName": "EndpointReference.isHttpSchemeNamedEndpoint",
- "description": "Gets the IsHttpSchemeNamedEndpoint property",
+ "description": "Gets a value indicating whether the endpoint name is \"http\" or \"https\", ignoring case. This is a convention used to identify endpoints that will be resolved based on the scheme of the endpoint in service discovery rather than by the specific endpoint name. This is done to allow http endpoints that are dynamically updated to https to be mapped correctly despite the endpoint name no longer matching the scheme.",
"kind": "PropertyGetter",
"signature": "isHttpSchemeNamedEndpoint(): boolean",
"parameters": [],
@@ -9403,7 +9621,7 @@
"name": "port",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.port",
"qualifiedName": "EndpointReference.port",
- "description": "Gets the Port property",
+ "description": "Gets the port for this endpoint.",
"kind": "PropertyGetter",
"signature": "port(): number",
"parameters": [],
@@ -9417,13 +9635,15 @@
"name": "property",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.property",
"qualifiedName": "EndpointReference.property",
- "description": "Gets the specified property expression of the endpoint",
+ "description": "Gets the specified property expression of the endpoint.",
+ "returns": "An `EndpointReferenceExpression` representing the specified `EndpointProperty`.",
"kind": "InstanceMethod",
"signature": "property(property: EndpointProperty): EndpointReferenceExpression",
"parameters": [
{
"name": "property",
- "type": "EndpointProperty"
+ "type": "EndpointProperty",
+ "description": "The `EndpointProperty` enum value to use in the reference."
}
],
"returnType": "EndpointReferenceExpression",
@@ -9436,7 +9656,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.resource",
"qualifiedName": "EndpointReference.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource owner of the endpoint reference.",
"kind": "PropertyGetter",
"signature": "resource(): IResourceWithEndpoints",
"parameters": [],
@@ -9450,7 +9670,7 @@
"name": "scheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.scheme",
"qualifiedName": "EndpointReference.scheme",
- "description": "Gets the Scheme property",
+ "description": "Gets the scheme for this endpoint.",
"kind": "PropertyGetter",
"signature": "scheme(): string",
"parameters": [],
@@ -9460,30 +9680,11 @@
"Aspire.Hosting.ApplicationModel.EndpointReference"
]
},
- {
- "name": "setErrorMessage",
- "capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.setErrorMessage",
- "qualifiedName": "EndpointReference.setErrorMessage",
- "description": "Sets the ErrorMessage property",
- "kind": "PropertySetter",
- "signature": "setErrorMessage(value: string): EndpointReference",
- "parameters": [
- {
- "name": "value",
- "type": "string"
- }
- ],
- "returnType": "EndpointReference",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.EndpointReference"
- ]
- },
{
"name": "targetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.targetPort",
"qualifiedName": "EndpointReference.targetPort",
- "description": "Gets the TargetPort property",
+ "description": "Gets the target port for this endpoint. If the port is dynamically allocated, this will return `null`.",
"kind": "PropertyGetter",
"signature": "targetPort(): number",
"parameters": [],
@@ -9497,7 +9698,8 @@
"name": "tlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.tlsEnabled",
"qualifiedName": "EndpointReference.tlsEnabled",
- "description": "Gets the TlsEnabled property",
+ "description": "Gets a value indicating whether TLS is enabled for this endpoint.",
+ "remarks": "Returns `false` if the endpoint annotation has not been added to the resource yet.\nOnce the annotation exists, this property delegates to `TlsEnabled`.",
"kind": "PropertyGetter",
"signature": "tlsEnabled(): boolean",
"parameters": [],
@@ -9511,7 +9713,7 @@
"name": "url",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReference.url",
"qualifiedName": "EndpointReference.url",
- "description": "Gets the Url property",
+ "description": "Gets the URL for this endpoint.",
"kind": "PropertyGetter",
"signature": "url(): string",
"parameters": [],
@@ -9528,6 +9730,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.EndpointReferenceExpression",
"kind": "handle",
"exposeProperties": true,
+ "description": "Represents a property expression for an endpoint reference.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IExpressionValue",
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
@@ -9539,7 +9742,7 @@
"name": "endpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.endpoint",
"qualifiedName": "EndpointReferenceExpression.endpoint",
- "description": "Gets the Endpoint property",
+ "description": "Gets the `EndpointReference`.",
"kind": "PropertyGetter",
"signature": "endpoint(): EndpointReference",
"parameters": [],
@@ -9553,7 +9756,7 @@
"name": "property",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.property",
"qualifiedName": "EndpointReferenceExpression.property",
- "description": "Gets the Property property",
+ "description": "Gets the `EndpointProperty` for the property expression.",
"kind": "PropertyGetter",
"signature": "property(): EndpointProperty",
"parameters": [],
@@ -9567,7 +9770,7 @@
"name": "valueExpression",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.valueExpression",
"qualifiedName": "EndpointReferenceExpression.valueExpression",
- "description": "Gets the ValueExpression property",
+ "description": "Gets the expression of the property of the endpoint.",
"kind": "PropertyGetter",
"signature": "valueExpression(): string",
"parameters": [],
@@ -9584,13 +9787,14 @@
"fullName": "Aspire.Hosting.ApplicationModel.EndpointUpdateContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides a mutable callback context for updating an endpoint in polyglot app hosts.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "excludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.excludeReferenceEndpoint",
"qualifiedName": "EndpointUpdateContext.excludeReferenceEndpoint",
- "description": "Gets the ExcludeReferenceEndpoint property",
+ "description": "Gets or sets a value indicating whether the endpoint is excluded from the default reference set.",
"kind": "PropertyGetter",
"signature": "excludeReferenceEndpoint(): boolean",
"parameters": [],
@@ -9604,7 +9808,7 @@
"name": "isExternal",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.isExternal",
"qualifiedName": "EndpointUpdateContext.isExternal",
- "description": "Gets the IsExternal property",
+ "description": "Gets or sets a value indicating whether the endpoint is external.",
"kind": "PropertyGetter",
"signature": "isExternal(): boolean",
"parameters": [],
@@ -9618,7 +9822,7 @@
"name": "isProxied",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.isProxied",
"qualifiedName": "EndpointUpdateContext.isProxied",
- "description": "Gets the IsProxied property",
+ "description": "Gets or sets a value indicating whether the endpoint is proxied.",
"kind": "PropertyGetter",
"signature": "isProxied(): boolean",
"parameters": [],
@@ -9632,7 +9836,7 @@
"name": "name",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.name",
"qualifiedName": "EndpointUpdateContext.name",
- "description": "Gets the Name property",
+ "description": "Gets the endpoint name.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -9646,7 +9850,7 @@
"name": "port",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.port",
"qualifiedName": "EndpointUpdateContext.port",
- "description": "Gets the Port property",
+ "description": "Gets or sets the desired host port.",
"kind": "PropertyGetter",
"signature": "port(): number",
"parameters": [],
@@ -9660,7 +9864,7 @@
"name": "protocol",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.protocol",
"qualifiedName": "EndpointUpdateContext.protocol",
- "description": "Gets the Protocol property",
+ "description": "Gets or sets the network protocol.",
"kind": "PropertyGetter",
"signature": "protocol(): ProtocolType",
"parameters": [],
@@ -9674,7 +9878,7 @@
"name": "setExcludeReferenceEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setExcludeReferenceEndpoint",
"qualifiedName": "EndpointUpdateContext.setExcludeReferenceEndpoint",
- "description": "Sets the ExcludeReferenceEndpoint property",
+ "description": "Gets or sets a value indicating whether the endpoint is excluded from the default reference set.",
"kind": "PropertySetter",
"signature": "setExcludeReferenceEndpoint(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -9693,7 +9897,7 @@
"name": "setIsExternal",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setIsExternal",
"qualifiedName": "EndpointUpdateContext.setIsExternal",
- "description": "Sets the IsExternal property",
+ "description": "Gets or sets a value indicating whether the endpoint is external.",
"kind": "PropertySetter",
"signature": "setIsExternal(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -9712,7 +9916,7 @@
"name": "setIsProxied",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setIsProxied",
"qualifiedName": "EndpointUpdateContext.setIsProxied",
- "description": "Sets the IsProxied property",
+ "description": "Gets or sets a value indicating whether the endpoint is proxied.",
"kind": "PropertySetter",
"signature": "setIsProxied(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -9731,7 +9935,7 @@
"name": "setPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setPort",
"qualifiedName": "EndpointUpdateContext.setPort",
- "description": "Sets the Port property",
+ "description": "Gets or sets the desired host port.",
"kind": "PropertySetter",
"signature": "setPort(value: number): EndpointUpdateContext",
"parameters": [
@@ -9750,7 +9954,7 @@
"name": "setProtocol",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setProtocol",
"qualifiedName": "EndpointUpdateContext.setProtocol",
- "description": "Sets the Protocol property",
+ "description": "Gets or sets the network protocol.",
"kind": "PropertySetter",
"signature": "setProtocol(value: ProtocolType): EndpointUpdateContext",
"parameters": [
@@ -9769,7 +9973,7 @@
"name": "setTargetHost",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTargetHost",
"qualifiedName": "EndpointUpdateContext.setTargetHost",
- "description": "Sets the TargetHost property",
+ "description": "Gets or sets the target host.",
"kind": "PropertySetter",
"signature": "setTargetHost(value: string): EndpointUpdateContext",
"parameters": [
@@ -9788,7 +9992,7 @@
"name": "setTargetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTargetPort",
"qualifiedName": "EndpointUpdateContext.setTargetPort",
- "description": "Sets the TargetPort property",
+ "description": "Gets or sets the target port.",
"kind": "PropertySetter",
"signature": "setTargetPort(value: number): EndpointUpdateContext",
"parameters": [
@@ -9807,7 +10011,7 @@
"name": "setTlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTlsEnabled",
"qualifiedName": "EndpointUpdateContext.setTlsEnabled",
- "description": "Sets the TlsEnabled property",
+ "description": "Gets or sets a value indicating whether TLS is enabled.",
"kind": "PropertySetter",
"signature": "setTlsEnabled(value: boolean): EndpointUpdateContext",
"parameters": [
@@ -9826,7 +10030,7 @@
"name": "setTransport",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setTransport",
"qualifiedName": "EndpointUpdateContext.setTransport",
- "description": "Sets the Transport property",
+ "description": "Gets or sets the transport.",
"kind": "PropertySetter",
"signature": "setTransport(value: string): EndpointUpdateContext",
"parameters": [
@@ -9845,7 +10049,7 @@
"name": "setUriScheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.setUriScheme",
"qualifiedName": "EndpointUpdateContext.setUriScheme",
- "description": "Sets the UriScheme property",
+ "description": "Gets or sets the URI scheme.",
"kind": "PropertySetter",
"signature": "setUriScheme(value: string): EndpointUpdateContext",
"parameters": [
@@ -9864,7 +10068,7 @@
"name": "targetHost",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.targetHost",
"qualifiedName": "EndpointUpdateContext.targetHost",
- "description": "Gets the TargetHost property",
+ "description": "Gets or sets the target host.",
"kind": "PropertyGetter",
"signature": "targetHost(): string",
"parameters": [],
@@ -9878,7 +10082,7 @@
"name": "targetPort",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.targetPort",
"qualifiedName": "EndpointUpdateContext.targetPort",
- "description": "Gets the TargetPort property",
+ "description": "Gets or sets the target port.",
"kind": "PropertyGetter",
"signature": "targetPort(): number",
"parameters": [],
@@ -9892,7 +10096,7 @@
"name": "tlsEnabled",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.tlsEnabled",
"qualifiedName": "EndpointUpdateContext.tlsEnabled",
- "description": "Gets the TlsEnabled property",
+ "description": "Gets or sets a value indicating whether TLS is enabled.",
"kind": "PropertyGetter",
"signature": "tlsEnabled(): boolean",
"parameters": [],
@@ -9906,7 +10110,7 @@
"name": "transport",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.transport",
"qualifiedName": "EndpointUpdateContext.transport",
- "description": "Gets the Transport property",
+ "description": "Gets or sets the transport.",
"kind": "PropertyGetter",
"signature": "transport(): string",
"parameters": [],
@@ -9920,7 +10124,7 @@
"name": "uriScheme",
"capabilityId": "Aspire.Hosting.ApplicationModel/EndpointUpdateContext.uriScheme",
"qualifiedName": "EndpointUpdateContext.uriScheme",
- "description": "Gets the UriScheme property",
+ "description": "Gets or sets the URI scheme.",
"kind": "PropertyGetter",
"signature": "uriScheme(): string",
"parameters": [],
@@ -9936,13 +10140,14 @@
"name": "EnvironmentCallbackContext",
"fullName": "Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext",
"kind": "handle",
+ "description": "Represents a callback context for environment variables associated with a publisher.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "environment",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.environment",
"qualifiedName": "EnvironmentCallbackContext.environment",
- "description": "Gets the environment variable editor",
+ "description": "Gets the editor used to set environment variables in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "environment(): EnvironmentEditor",
"parameters": [],
@@ -9956,7 +10161,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.executionContext",
"qualifiedName": "EnvironmentCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this invocation of the AppHost.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -9970,7 +10175,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.log",
"qualifiedName": "EnvironmentCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -9984,7 +10189,8 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.resource",
"qualifiedName": "EnvironmentCallbackContext.resource",
- "description": "Gets the resource associated with this callback",
+ "description": "The resource associated with this callback context.",
+ "remarks": "This will be set to the resource in all cases where Aspire invokes the callback.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -10000,23 +10206,26 @@
"name": "EnvironmentEditor",
"fullName": "Aspire.Hosting.ApplicationModel.EnvironmentEditor",
"kind": "handle",
+ "description": "Provides an ATS-first editor for environment variables within polyglot callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "set",
"capabilityId": "Aspire.Hosting.ApplicationModel/set",
"qualifiedName": "EnvironmentEditor.set",
- "description": "Sets an environment variable",
+ "description": "Sets an environment variable.",
"kind": "InstanceMethod",
"signature": "set(name: string, value: IExpressionValue): void",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the environment variable."
},
{
"name": "value",
- "type": "IExpressionValue"
+ "type": "IExpressionValue",
+ "description": "The value to assign to the environment variable."
}
],
"returnType": "void",
@@ -10031,6 +10240,8 @@
"name": "ExecutableResource",
"fullName": "Aspire.Hosting.ApplicationModel.ExecutableResource",
"kind": "handle",
+ "description": "A resource that represents a specified executable process.",
+ "remarks": "You can run any executable command using its full path.\nAs a security feature, Aspire doesn't run executable unless the command is located in a path listed in the PATH environment variable.\nTo run an executable file that's in the current directory, specify the full path or use the relative path `./` to represent the current directory.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IComputeResource",
"Aspire.Hosting.ApplicationModel.IResource",
@@ -10045,15 +10256,18 @@
"name": "publishAsDockerFile",
"capabilityId": "Aspire.Hosting/publishAsDockerFile",
"qualifiedName": "publishAsDockerFile",
- "description": "Publishes an executable as a Docker file",
+ "description": "Adds support for containerizing this `ExecutableResource` during deployment. The resulting container image is built, and when the optional `configure` action is provided, it is used to configure the container resource.",
+ "remarks": "When the executable resource is converted to a container resource, the arguments to the executable\nare not used. This is because arguments to the executable often contain physical paths that are not valid\nin the container. The container can be set up with the correct arguments using the `configure` action.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "publishAsDockerFile(configure: (obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E): ExecutableResource",
+ "signature": "publishAsDockerFile(configure: (obj: ContainerResource) => Promise): ExecutableResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ContainerResource) => Promise",
+ "description": "Optional action to configure the container resource"
}
],
"returnType": "ExecutableResource",
@@ -10068,13 +10282,15 @@
"name": "withExecutableCommand",
"capabilityId": "Aspire.Hosting/withExecutableCommand",
"qualifiedName": "withExecutableCommand",
- "description": "Sets the executable command",
+ "description": "Sets the command for the executable resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExecutableCommand(command: string): ExecutableResource",
"parameters": [
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "Command."
}
],
"returnType": "ExecutableResource",
@@ -10089,13 +10305,15 @@
"name": "withWorkingDirectory",
"capabilityId": "Aspire.Hosting/withWorkingDirectory",
"qualifiedName": "withWorkingDirectory",
- "description": "Sets the executable working directory",
+ "description": "Sets the working directory for the executable resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withWorkingDirectory(workingDirectory: string): ExecutableResource",
"parameters": [
{
"name": "workingDirectory",
- "type": "string"
+ "type": "string",
+ "description": "Working directory."
}
],
"returnType": "ExecutableResource",
@@ -10113,13 +10331,14 @@
"fullName": "Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Context for `ExecuteCommand`.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.cancellationToken",
"qualifiedName": "ExecuteCommandContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "The cancellation token.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -10133,7 +10352,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.logger",
"qualifiedName": "ExecuteCommandContext.logger",
- "description": "Gets the Logger property",
+ "description": "The logger for the resource.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -10147,7 +10366,7 @@
"name": "resourceName",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.resourceName",
"qualifiedName": "ExecuteCommandContext.resourceName",
- "description": "Gets the ResourceName property",
+ "description": "The resource name.",
"kind": "PropertyGetter",
"signature": "resourceName(): string",
"parameters": [],
@@ -10161,7 +10380,7 @@
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.serviceProvider",
"qualifiedName": "ExecuteCommandContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The service provider.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -10170,82 +10389,6 @@
"expandedTargetTypes": [
"Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
]
- },
- {
- "name": "setCancellationToken",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setCancellationToken",
- "qualifiedName": "ExecuteCommandContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
- "kind": "PropertySetter",
- "signature": "setCancellationToken(value: cancellationToken): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "cancellationToken"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setLogger",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setLogger",
- "qualifiedName": "ExecuteCommandContext.setLogger",
- "description": "Sets the Logger property",
- "kind": "PropertySetter",
- "signature": "setLogger(value: ILogger): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "ILogger"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setResourceName",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setResourceName",
- "qualifiedName": "ExecuteCommandContext.setResourceName",
- "description": "Sets the ResourceName property",
- "kind": "PropertySetter",
- "signature": "setResourceName(value: string): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "string"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
- },
- {
- "name": "setServiceProvider",
- "capabilityId": "Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setServiceProvider",
- "qualifiedName": "ExecuteCommandContext.setServiceProvider",
- "description": "Sets the ServiceProvider property",
- "kind": "PropertySetter",
- "signature": "setServiceProvider(value: IServiceProvider): ExecuteCommandContext",
- "parameters": [
- {
- "name": "value",
- "type": "IServiceProvider"
- }
- ],
- "returnType": "ExecuteCommandContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.ExecuteCommandContext"
- ]
}
]
},
@@ -10255,23 +10398,28 @@
"kind": "handle",
"isInterface": true,
"exposeProperties": true,
+ "description": "Represents a store for managing files in the Aspire hosting environment that can be reused across runs.",
+ "remarks": "The store is created in the ./obj folder of the Application Host.\nIf the ASPIRE__STORE__PATH environment variable is set this will be used instead.\nThe store is specific to a `IDistributedApplicationBuilder` instance such that each application can't\nconflict with others. A .aspire prefix is also used to ensure that the folder can be deleted without impacting\nunrelated files.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "getFileNameWithContent",
"capabilityId": "Aspire.Hosting/getFileNameWithContent",
"qualifiedName": "getFileNameWithContent",
- "description": "Gets a deterministic file path for the specified file contents",
+ "description": "Gets a deterministic file path that is a copy of the `sourceFilename`. The resulting file name will depend on the content of the file.",
+ "returns": "A deterministic file path with the same content as `sourceFilename`.",
"kind": "Method",
"signature": "getFileNameWithContent(filenameTemplate: string, sourceFilename: string): string",
"parameters": [
{
"name": "filenameTemplate",
- "type": "string"
+ "type": "string",
+ "description": "A file name to base the result on."
},
{
"name": "sourceFilename",
- "type": "string"
+ "type": "string",
+ "description": "An existing file."
}
],
"returnType": "string",
@@ -10287,29 +10435,34 @@
"fullName": "Aspire.Hosting.ApplicationModel.IExecutionConfigurationBuilder",
"kind": "handle",
"isInterface": true,
+ "description": "Builder for gathering and resolving the execution configuration (arguments and environment variables) for a specific resource.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "build",
"capabilityId": "Aspire.Hosting/buildExecutionConfiguration",
"qualifiedName": "build",
- "description": "Builds the execution configuration",
+ "description": "Builds the execution configuration for the specified builder.",
+ "returns": "The resolved execution configuration.",
"kind": "Method",
"signature": "build(executionContext: DistributedApplicationExecutionContext, resourceLogger?: ILogger, cancellationToken?: cancellationToken): IExecutionConfigurationResult",
"parameters": [
{
"name": "executionContext",
- "type": "DistributedApplicationExecutionContext"
+ "type": "DistributedApplicationExecutionContext",
+ "description": "The execution context used while building the configuration."
},
{
"name": "resourceLogger",
"type": "ILogger",
- "isOptional": true
+ "isOptional": true,
+ "description": "The logger used while resolving values."
},
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "A cancellation token."
}
],
"returnType": "IExecutionConfigurationResult",
@@ -10322,7 +10475,8 @@
"name": "withArgumentsConfig",
"capabilityId": "Aspire.Hosting/withArgumentsConfig",
"qualifiedName": "withArgumentsConfig",
- "description": "Adds an arguments configuration gatherer",
+ "description": "Adds a command line arguments configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
"signature": "withArgumentsConfig(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -10336,15 +10490,17 @@
"name": "withCertificateTrustConfig",
"capabilityId": "Aspire.Hosting/withCertificateTrustConfig",
"qualifiedName": "withCertificateTrustConfig",
- "description": "Adds a certificate trust configuration gatherer",
+ "description": "Adds a certificate trust configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
- "signature": "withCertificateTrustConfig(configContextFactory: (arg: CertificateTrustScope) =\u003E Promise\u003CCertificateTrustExecutionConfigurationContext\u003E): IExecutionConfigurationBuilder",
+ "signature": "withCertificateTrustConfig(configContextFactory: (arg: CertificateTrustScope) => Promise): IExecutionConfigurationBuilder",
"parameters": [
{
"name": "configContextFactory",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: CertificateTrustScope) =\u003E Promise\u003CCertificateTrustExecutionConfigurationContext\u003E"
+ "callbackSignature": "(arg: CertificateTrustScope) => Promise",
+ "description": "A factory function to create the configuration context."
}
],
"returnType": "IExecutionConfigurationBuilder",
@@ -10357,7 +10513,8 @@
"name": "withEnvironmentVariablesConfig",
"capabilityId": "Aspire.Hosting/withEnvironmentVariablesConfig",
"qualifiedName": "withEnvironmentVariablesConfig",
- "description": "Adds an environment variables configuration gatherer",
+ "description": "Adds an environment variables configuration gatherer to the builder.",
+ "returns": "The builder with the configuration gatherer added.",
"kind": "Method",
"signature": "withEnvironmentVariablesConfig(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -10371,15 +10528,17 @@
"name": "withHttpsCertificateConfig",
"capabilityId": "Aspire.Hosting/withHttpsCertificateConfigExport",
"qualifiedName": "withHttpsCertificateConfig",
- "description": "Adds an HTTPS certificate configuration gatherer",
+ "description": "Adds an HTTPS certificate configuration gatherer using certificate metadata instead of a raw X509 certificate.",
+ "returns": "The execution configuration builder.",
"kind": "Method",
- "signature": "withHttpsCertificateConfig(configContextFactory: (arg: HttpsCertificateInfo) =\u003E Promise\u003CHttpsCertificateExecutionConfigurationContext\u003E): IExecutionConfigurationBuilder",
+ "signature": "withHttpsCertificateConfig(configContextFactory: (arg: HttpsCertificateInfo) => Promise): IExecutionConfigurationBuilder",
"parameters": [
{
"name": "configContextFactory",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: HttpsCertificateInfo) =\u003E Promise\u003CHttpsCertificateExecutionConfigurationContext\u003E"
+ "callbackSignature": "(arg: HttpsCertificateInfo) => Promise",
+ "description": "The factory that creates the HTTPS certificate configuration context."
}
],
"returnType": "IExecutionConfigurationBuilder",
@@ -10395,13 +10554,15 @@
"fullName": "Aspire.Hosting.ApplicationModel.IExecutionConfigurationResult",
"kind": "handle",
"isInterface": true,
+ "description": "Configuration (arguments and environment variables) to apply to a specific resource.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "getCertificateTrustData",
"capabilityId": "Aspire.Hosting/getCertificateTrustData",
"qualifiedName": "getCertificateTrustData",
- "description": "Gets certificate trust execution-configuration data",
+ "description": "Gets certificate trust execution-configuration data when present.",
+ "returns": "The certificate trust data. When no additional data is present, an empty DTO is returned.",
"kind": "Method",
"signature": "getCertificateTrustData(): CertificateTrustExecutionConfigurationExportData",
"parameters": [],
@@ -10415,7 +10576,8 @@
"name": "getHttpsCertificateData",
"capabilityId": "Aspire.Hosting/getHttpsCertificateData",
"qualifiedName": "getHttpsCertificateData",
- "description": "Gets HTTPS certificate execution-configuration data",
+ "description": "Gets HTTPS certificate execution-configuration data when present.",
+ "returns": "The HTTPS certificate data. When no additional data is present, an empty DTO is returned.",
"kind": "Method",
"signature": "getHttpsCertificateData(): HttpsCertificateExecutionConfigurationExportData",
"parameters": [],
@@ -10432,6 +10594,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.IExpressionValue",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a value that provides both a runtime value and a manifest expression.",
+ "remarks": "Expression values can be used anywhere both a runtime value and a publish-time\nmanifest expression are needed.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -10440,6 +10604,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.InitializeResourceEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is raised by orchestrators to signal to resources that they should initialize themselves.",
+ "remarks": "Custom resources can subscribe to this event to perform initialization tasks, including starting background tasks\nthat manage the resource's lifecycle.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -10449,7 +10615,7 @@
"name": "eventing",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.eventing",
"qualifiedName": "InitializeResourceEvent.eventing",
- "description": "Gets the Eventing property",
+ "description": "The `IDistributedApplicationEventing` service for the app host.",
"kind": "PropertyGetter",
"signature": "eventing(): IDistributedApplicationEventing",
"parameters": [],
@@ -10463,7 +10629,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.logger",
"qualifiedName": "InitializeResourceEvent.logger",
- "description": "Gets the Logger property",
+ "description": "An instance of `ILogger` that can be used to log messages for the resource.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -10477,7 +10643,7 @@
"name": "notifications",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.notifications",
"qualifiedName": "InitializeResourceEvent.notifications",
- "description": "Gets the Notifications property",
+ "description": "The `ResourceNotificationService` for the app host.",
"kind": "PropertyGetter",
"signature": "notifications(): ResourceNotificationService",
"parameters": [],
@@ -10505,7 +10671,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.ApplicationModel/InitializeResourceEvent.services",
"qualifiedName": "InitializeResourceEvent.services",
- "description": "Gets the Services property",
+ "description": "The `IServiceProvider` for the app host.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -10522,13 +10688,15 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResource",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that can be hosted by an application.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "createExecutionConfiguration",
"capabilityId": "Aspire.Hosting/createExecutionConfiguration",
"qualifiedName": "createExecutionConfiguration",
- "description": "Creates an execution configuration builder",
+ "description": "Creates an execution configuration builder for the specified resource.",
+ "returns": "The execution configuration builder.",
"kind": "Method",
"signature": "createExecutionConfiguration(): IExecutionConfigurationBuilder",
"parameters": [],
@@ -10549,7 +10717,8 @@
"name": "excludeFromManifest",
"capabilityId": "Aspire.Hosting/excludeFromManifest",
"qualifiedName": "excludeFromManifest",
- "description": "Excludes the resource from the deployment manifest",
+ "description": "Excludes a resource from being published to the manifest.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "excludeFromManifest(): IResource",
"parameters": [],
@@ -10571,7 +10740,8 @@
"name": "excludeFromMcp",
"capabilityId": "Aspire.Hosting/excludeFromMcp",
"qualifiedName": "excludeFromMcp",
- "description": "Excludes the resource from MCP server exposure",
+ "description": "Exclude the resource from MCP operations using the Aspire MCP server. The resource is excluded from results that return resources, console logs and telemetry.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "excludeFromMcp(): IResource",
"parameters": [],
@@ -10593,7 +10763,9 @@
"name": "getResourceName",
"capabilityId": "Aspire.Hosting/getResourceName",
"qualifiedName": "getResourceName",
- "description": "Gets the resource name",
+ "description": "Gets the name of the resource from a builder.",
+ "remarks": "Why this wrapper exists: This capability accesses a nested property\n(`resource.Resource.Name`) which requires a wrapper method. There is no single\n.NET method that returns just the resource name that could be annotated directly.",
+ "returns": "The resource name.",
"kind": "Method",
"signature": "getResourceName(): string",
"parameters": [],
@@ -10614,15 +10786,17 @@
"name": "onBeforeResourceStarted",
"capabilityId": "Aspire.Hosting/onBeforeResourceStarted",
"qualifiedName": "onBeforeResourceStarted",
- "description": "Subscribes to the BeforeResourceStarted event",
+ "description": "Subscribes to the BeforeResourceStarted event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onBeforeResourceStarted(callback: (arg: BeforeResourceStartedEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onBeforeResourceStarted(callback: (arg: BeforeResourceStartedEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeResourceStartedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeResourceStartedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -10643,15 +10817,17 @@
"name": "onInitializeResource",
"capabilityId": "Aspire.Hosting/onInitializeResource",
"qualifiedName": "onInitializeResource",
- "description": "Subscribes to the InitializeResource event",
+ "description": "Subscribes to the InitializeResource event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onInitializeResource(callback: (arg: InitializeResourceEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onInitializeResource(callback: (arg: InitializeResourceEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: InitializeResourceEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: InitializeResourceEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -10672,15 +10848,17 @@
"name": "onResourceReady",
"capabilityId": "Aspire.Hosting/onResourceReady",
"qualifiedName": "onResourceReady",
- "description": "Subscribes to the ResourceReady event",
+ "description": "Subscribes to the ResourceReady event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceReady(callback: (arg: ResourceReadyEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onResourceReady(callback: (arg: ResourceReadyEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceReadyEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceReadyEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -10701,15 +10879,17 @@
"name": "onResourceStopped",
"capabilityId": "Aspire.Hosting/onResourceStopped",
"qualifiedName": "onResourceStopped",
- "description": "Subscribes to the ResourceStopped event",
+ "description": "Subscribes to the ResourceStopped event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceStopped(callback: (arg: ResourceStoppedEvent) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "onResourceStopped(callback: (arg: ResourceStoppedEvent) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceStoppedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceStoppedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResource",
@@ -10730,13 +10910,16 @@
"name": "withChildRelationship",
"capabilityId": "Aspire.Hosting/withBuilderChildRelationship",
"qualifiedName": "withChildRelationship",
- "description": "Sets a child relationship",
+ "description": "Adds a `ResourceRelationshipAnnotation` to the resource annotations to add a parent-child relationship.",
+ "remarks": "The `WithChildRelationship` method is used to add child relationships to the resource. Relationships are used to link\nresources together in UI.\nThis example shows adding a relationship between two resources.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar parameter = builder.AddParameter(\"parameter\");\nvar backend = builder.AddProject(\"backend\");\n.WithChildRelationship(parameter);\n```",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withChildRelationship(child: IResource): IResource",
"parameters": [
{
"name": "child",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The child of `builder`."
}
],
"returnType": "IResource",
@@ -10757,28 +10940,34 @@
"name": "withCommand",
"capabilityId": "Aspire.Hosting/withCommand",
"qualifiedName": "withCommand",
- "description": "Adds a resource command",
+ "description": "Adds a `ResourceCommandAnnotation` to the resource annotations to add a resource command.",
+ "remarks": "The `WithCommand` method is used to add commands to the resource. Commands are displayed in the dashboard\nand can be executed by a user using the dashboard UI.\nWhen a command is executed, the `executeCommand` callback is called and is run inside the Aspire host.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withCommand(name: string, displayName: string, executeCommand: (arg: ExecuteCommandContext) =\u003E Promise\u003CExecuteCommandResult\u003E, commandOptions?: CommandOptions): IResource",
+ "signature": "withCommand(name: string, displayName: string, executeCommand: (arg: ExecuteCommandContext) => Promise, commandOptions?: CommandOptions): IResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the command. The name uniquely identifies the command."
},
{
"name": "displayName",
- "type": "string"
+ "type": "string",
+ "description": "The display name visible in UI."
},
{
"name": "executeCommand",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ExecuteCommandContext) =\u003E Promise\u003CExecuteCommandResult\u003E"
+ "callbackSignature": "(arg: ExecuteCommandContext) => Promise",
+ "description": "A callback that is executed when the command is executed. The callback is run inside the Aspire host. The callback result is used to indicate success or failure in the UI."
},
{
"name": "commandOptions",
"type": "CommandOptions",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional configuration for the command."
}
],
"returnType": "IResource",
@@ -10799,13 +10988,16 @@
"name": "withContainerRegistry",
"capabilityId": "Aspire.Hosting/withContainerRegistry",
"qualifiedName": "withContainerRegistry",
- "description": "Configures a resource to use a container registry",
+ "description": "Configures the resource to use the specified container registry for container image operations.",
+ "remarks": "This method adds a `ContainerRegistryReferenceAnnotation` to the resource,\nindicating that the resource should use the specified container registry for container image operations.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
"signature": "withContainerRegistry(registry: IResource): IResource",
"parameters": [
{
"name": "registry",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The container registry resource builder."
}
],
"returnType": "IResource",
@@ -10826,19 +11018,23 @@
"name": "withDockerfileBaseImage",
"capabilityId": "Aspire.Hosting/withDockerfileBaseImage",
"qualifiedName": "withDockerfileBaseImage",
- "description": "Sets the base image for a Dockerfile build",
+ "description": "Configures custom base images for generated Dockerfiles.",
+ "remarks": "This extension method allows customization of the base images used in generated Dockerfiles.\nFor multi-stage Dockerfiles (e.g., Python with UV), you can specify separate build and runtime images.\nSpecify custom base images for a Python application:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddPythonApp(\"myapp\", \"path/to/app\", \"main.py\")\n.WithDockerfileBaseImage(\nbuildImage: \"ghcr.io/astral-sh/uv:python3.12-bookworm-slim\",\nruntimeImage: \"python:3.12-slim-bookworm\");\nbuilder.Build().Run();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDockerfileBaseImage(buildImage?: string, runtimeImage?: string): IResource",
"parameters": [
{
"name": "buildImage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The base image to use for the build stage. If null, uses the default build image."
},
{
"name": "runtimeImage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The base image to use for the runtime stage. If null, uses the default runtime image."
}
],
"returnType": "IResource",
@@ -10859,7 +11055,9 @@
"name": "withExplicitStart",
"capabilityId": "Aspire.Hosting/withExplicitStart",
"qualifiedName": "withExplicitStart",
- "description": "Prevents resource from starting automatically",
+ "description": "Adds a `ExplicitStartupAnnotation` annotation to the resource so it doesn't automatically start with the app host startup.",
+ "remarks": "This method is useful when a resource shouldn't automatically start when the app host starts.\nThe database clean up tool project isn't started with the app host.\nThe resource start command can be used to run it ondemand later.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar pgsql = builder.AddPostgres(\"postgres\");\nbuilder.AddProject(\"dbcleanuptool\")\n.WithReference(pgsql)\n.WithExplicitStart();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExplicitStart(): IResource",
"parameters": [],
@@ -10881,13 +11079,16 @@
"name": "withHealthCheck",
"capabilityId": "Aspire.Hosting/withHealthCheck",
"qualifiedName": "withHealthCheck",
- "description": "Adds a health check by key",
+ "description": "Adds a `HealthCheckAnnotation` to the resource annotations to associate a resource with a named health check managed by the health check service.",
+ "remarks": "The `WithHealthCheck``1` method is used in conjunction with\nthe `WaitFor``1` to associate a resource\nregistered in the application hosts dependency injection container. The `WithHealthCheck``1`\nmethod does not inject the health check itself it is purely an association mechanism.\nDefine a custom health check and associate it with a resource.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar startAfter = DateTime.Now.AddSeconds(30);\nbuilder.Services.AddHealthChecks().AddCheck(mycheck\", () =>\n{\nreturn DateTime.Now > startAfter ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();\n});\nvar pg = builder.AddPostgres(\"pg\")\n.WithHealthCheck(\"mycheck\");\nbuilder.AddProject(\"myapp\")\n.WithReference(pg)\n.WaitFor(pg); // This will result in waiting for the building check, and the\n// custom check defined in the code.\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHealthCheck(key: string): IResource",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key for the health check."
}
],
"returnType": "IResource",
@@ -10908,19 +11109,23 @@
"name": "withIconName",
"capabilityId": "Aspire.Hosting/withIconName",
"qualifiedName": "withIconName",
- "description": "Sets the icon for the resource",
+ "description": "Specifies the icon to use when displaying the resource in the dashboard.",
+ "remarks": "This method allows you to specify a custom FluentUI icon that will be displayed for the resource in the dashboard.\nIf no custom icon is specified, the dashboard will use default icons based on the resource type.\nSet a Redis resource to use the Database icon:\n```\nvar redis = builder.AddContainer(\"redis\", \"redis:latest\")\n.WithIconName(\"Database\");\n```\nSet a custom service to use a specific icon with Regular variant:\n```\nvar service = builder.AddProject(\"service\")\n.WithIconName(\"CloudArrowUp\", IconVariant.Regular);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withIconName(iconName: string, iconVariant?: IconVariant): IResource",
"parameters": [
{
"name": "iconName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the FluentUI icon to use. See https://aka.ms/fluentui-system-icons for available icons."
},
{
"name": "iconVariant",
"type": "IconVariant",
"isOptional": true,
- "defaultValue": "Filled"
+ "defaultValue": "Filled",
+ "description": "The variant of the icon (Regular or Filled). Defaults to Filled."
}
],
"returnType": "IResource",
@@ -10941,13 +11146,16 @@
"name": "withParentRelationship",
"capabilityId": "Aspire.Hosting/withBuilderParentRelationship",
"qualifiedName": "withParentRelationship",
- "description": "Sets the parent relationship",
+ "description": "Adds a `ResourceRelationshipAnnotation` to the resource annotations to add a parent-child relationship.",
+ "remarks": "The `WithParentRelationship` method is used to add parent relationships to the resource. Relationships are used to link\nresources together in UI.\nThis example shows adding a relationship between two resources.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar backend = builder.AddProject(\"backend\");\nvar frontend = builder.AddProject(\"frontend\")\n.WithParentRelationship(backend);\n```",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withParentRelationship(parent: IResource): IResource",
"parameters": [
{
"name": "parent",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The parent of `builder`."
}
],
"returnType": "IResource",
@@ -10968,15 +11176,17 @@
"name": "withPipelineConfiguration",
"capabilityId": "Aspire.Hosting/withPipelineConfiguration",
"qualifiedName": "withPipelineConfiguration",
- "description": "Configures pipeline step dependencies via a callback",
+ "description": "Registers a callback to be executed during the pipeline configuration phase, allowing modification of step dependencies and relationships.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
- "signature": "withPipelineConfiguration(callback: (obj: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withPipelineConfiguration(callback: (obj: PipelineConfigurationContext) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: PipelineConfigurationContext) => Promise",
+ "description": "The callback function to execute during the configuration phase."
}
],
"returnType": "IResource",
@@ -10997,39 +11207,46 @@
"name": "withPipelineStepFactory",
"capabilityId": "Aspire.Hosting/withPipelineStepFactory",
"qualifiedName": "withPipelineStepFactory",
- "description": "Adds a pipeline step to the resource",
+ "description": "Adds a pipeline step to the resource that will be executed during deployment.",
+ "returns": "The resource builder for chaining.",
"kind": "Method",
- "signature": "withPipelineStepFactory(stepName: string, callback: (arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string): IResource",
+ "signature": "withPipelineStepFactory(stepName: string, callback: (arg: PipelineStepContext) => Promise, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string): IResource",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The unique name of the pipeline step."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineStepContext) => Promise",
+ "description": "The callback to execute when the step runs."
},
{
"name": "dependsOn",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that this step depends on."
},
{
"name": "requiredBy",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that require this step."
},
{
"name": "tags",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional tags that categorize this step."
},
{
"name": "description",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional human-readable description of the step."
}
],
"returnType": "IResource",
@@ -11050,17 +11267,20 @@
"name": "withRelationship",
"capabilityId": "Aspire.Hosting/withBuilderRelationship",
"qualifiedName": "withRelationship",
- "description": "Adds a relationship to another resource",
+ "description": "Adds a relationship to another resource using its builder.",
+ "returns": "A resource builder.",
"kind": "Method",
"signature": "withRelationship(resourceBuilder: IResource, type: string): IResource",
"parameters": [
{
"name": "resourceBuilder",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The resource builder that the relationship is to."
},
{
"name": "type",
- "type": "string"
+ "type": "string",
+ "description": "The relationship type."
}
],
"returnType": "IResource",
@@ -11081,18 +11301,22 @@
"name": "withRequiredCommand",
"capabilityId": "Aspire.Hosting/withRequiredCommand",
"qualifiedName": "withRequiredCommand",
- "description": "Adds a required command dependency",
+ "description": "Declares that a resource requires a specific command/executable to be available on the local machine PATH before it can start.",
+ "remarks": "The command is considered valid if either:\n1. It is an absolute or relative path (contains a directory separator) that points to an existing file, or\n2. It is discoverable on the current process PATH (respecting PATHEXT on Windows).\nIf the command is not found, a warning message will be logged but the resource will be allowed to attempt to start.",
+ "returns": "The resource builder.",
"kind": "Method",
"signature": "withRequiredCommand(command: string, helpLink?: string): IResource",
"parameters": [
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "The command string (file name or path) that should be validated."
},
{
"name": "helpLink",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional help link URL to guide users when the command is missing."
}
],
"returnType": "IResource",
@@ -11145,19 +11369,23 @@
"name": "withUrlForEndpoint",
"capabilityId": "Aspire.Hosting/withUrlForEndpoint",
"qualifiedName": "withUrlForEndpoint",
- "description": "Customizes the URL for a specific endpoint via callback",
+ "description": "Registers a callback to update the URL displayed for the endpoint with the specified name.",
+ "remarks": "Use this method to customize the URL that is automatically added for an endpoint on the resource.\nTo add another URL for an endpoint, use `WithUrlForEndpoint``1`.\nThe callback will be executed after endpoints have been allocated and the URL has been generated.\nThis allows you to modify the URL or its display text.\nIf the URL returned by `callback` is relative, it will be combined with the endpoint URL to create an absolute URL.\nIf the endpoint with the specified name does not exist, the callback will not be executed and a warning will be logged.\nCustomize the URL for the \"https\" endpoint to use the link text \"Home\":\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrlForEndpoint(\"https\", url => url.DisplayText = \"Home\");\n```\nCustomize the URL for the \"https\" endpoint to deep to the \"/home\" path:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrlForEndpoint(\"https\", url => url.Url = \"/home\");\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withUrlForEndpoint(endpointName: string, callback: (obj: ResourceUrlAnnotation) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withUrlForEndpoint(endpointName: string, callback: (obj: ResourceUrlAnnotation) => Promise): IResource",
"parameters": [
{
"name": "endpointName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint to customize the URL for."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ResourceUrlAnnotation) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ResourceUrlAnnotation) => Promise",
+ "description": "The callback that will customize the URL."
}
],
"returnType": "IResource",
@@ -11178,15 +11406,18 @@
"name": "withUrls",
"capabilityId": "Aspire.Hosting/withUrls",
"qualifiedName": "withUrls",
- "description": "Customizes displayed URLs via callback",
+ "description": "Registers a callback to customize the URLs displayed for the resource.",
+ "remarks": "The callback will be executed after endpoints have been allocated for this resource.\nThis allows you to modify any URLs for the resource, including adding, modifying, or even deletion.\nNote that any endpoints on the resource will automatically get a corresponding URL added for them.\nUpdate all displayed URLs to have display text:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrls(c =>\n{\nforeach (var url in c.Urls)\n{\nif (string.IsNullOrEmpty(url.DisplayText))\n{\nurl.DisplayText = \"frontend\";\n}\n}\n});\n```\nUpdate endpoint URLs to use a custom host name based on the resource name:\n```\nvar frontend = builder.AddProject(\"frontend\")\n.WithUrls(c =>\n{\nforeach (var url in c.Urls)\n{\nif (url.Endpoint is not null)\n{\nvar uri = new UriBuilder(url.Url) { Host = $\"{c.Resource.Name}.localhost\" };\nurl.Url = uri.ToString();\n}\n}\n});\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withUrls(callback: (obj: ResourceUrlsCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResource",
+ "signature": "withUrls(callback: (obj: ResourceUrlsCallbackContext) => Promise): IResource",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: ResourceUrlsCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ResourceUrlsCallbackContext) => Promise",
+ "description": "The callback that will customize URLs for the resource."
}
],
"returnType": "IResource",
@@ -11210,19 +11441,22 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithArgs",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that is associated with commandline arguments.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "withArgs",
"capabilityId": "Aspire.Hosting/withArgs",
"qualifiedName": "withArgs",
- "description": "Adds arguments",
+ "description": "Adds arguments to be passed to a resource that supports arguments when it is launched.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withArgs(args: string[]): IResourceWithArgs",
"parameters": [
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to be passed to the resource when it is started."
}
],
"returnType": "IResourceWithArgs",
@@ -11240,15 +11474,17 @@
"name": "withArgsCallback",
"capabilityId": "Aspire.Hosting/withArgsCallback",
"qualifiedName": "withArgsCallback",
- "description": "Sets command-line arguments via callback",
+ "description": "Adds a callback to be executed with a list of command-line arguments when a resource is started.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withArgsCallback(callback: (obj: CommandLineArgsCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResourceWithArgs",
+ "signature": "withArgsCallback(callback: (obj: CommandLineArgsCallbackContext) => Promise): IResourceWithArgs",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: CommandLineArgsCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: CommandLineArgsCallbackContext) => Promise",
+ "description": "A callback that allows for deferred execution for computing arguments. This runs after resources have been allocated by the orchestrator and allows access to other resources to resolve computed data, e.g. connection strings, ports."
}
],
"returnType": "IResourceWithArgs",
@@ -11269,19 +11505,23 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithConnectionString",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that has a connection string associated with it.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "getConnectionProperty",
"capabilityId": "Aspire.Hosting/getConnectionProperty",
"qualifiedName": "getConnectionProperty",
- "description": "Gets a connection property by key",
+ "description": "Retrieves the value of a specified connection property from the resource's connection properties.",
+ "remarks": "Throws a KeyNotFoundException if the specified key does not exist in the resource's\nconnection properties.",
+ "returns": "The value associated with the specified connection property key.",
"kind": "Method",
"signature": "getConnectionProperty(key: string): ReferenceExpression",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key of the connection property to retrieve. Cannot be null."
}
],
"returnType": "ReferenceExpression",
@@ -11294,15 +11534,17 @@
"name": "onConnectionStringAvailable",
"capabilityId": "Aspire.Hosting/onConnectionStringAvailable",
"qualifiedName": "onConnectionStringAvailable",
- "description": "Subscribes to the ConnectionStringAvailable event",
+ "description": "Subscribes to the ConnectionStringAvailable event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onConnectionStringAvailable(callback: (arg: ConnectionStringAvailableEvent) =\u003E Promise\u003Cvoid\u003E): IResourceWithConnectionString",
+ "signature": "onConnectionStringAvailable(callback: (arg: ConnectionStringAvailableEvent) => Promise): IResourceWithConnectionString",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ConnectionStringAvailableEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ConnectionStringAvailableEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResourceWithConnectionString",
@@ -11316,17 +11558,20 @@
"name": "withConnectionProperty",
"capabilityId": "Aspire.Hosting/withConnectionProperty",
"qualifiedName": "withConnectionProperty",
- "description": "Adds a connection property with a string or reference expression value",
+ "description": "Adds a connection property annotation to the resource being built.",
+ "returns": "The same resource builder instance with the specified connection property annotation applied.",
"kind": "Method",
"signature": "withConnectionProperty(name: string, value: ReferenceExpression): IResourceWithConnectionString",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the connection property to add."
},
{
"name": "value",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The value to assign to the connection property, specified as a string or reference expression."
}
],
"returnType": "IResourceWithConnectionString",
@@ -11343,13 +11588,15 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithEndpoints",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that has endpoints associated with it.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "asHttp2Service",
"capabilityId": "Aspire.Hosting/asHttp2Service",
"qualifiedName": "asHttp2Service",
- "description": "Configures resource for HTTP/2",
+ "description": "Configures a resource to mark all endpoints' transport as HTTP/2. This is useful for HTTP/2 services that need prior knowledge.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "asHttp2Service(): IResourceWithEndpoints",
"parameters": [],
@@ -11368,13 +11615,15 @@
"name": "getEndpoint",
"capabilityId": "Aspire.Hosting/getEndpoint",
"qualifiedName": "getEndpoint",
- "description": "Gets an endpoint reference",
+ "description": "Gets an `EndpointReference` by name from the resource. These endpoints are declared either using `WithEndpoint``1` or by launch settings (for project resources). The `EndpointReference` can be used to resolve the address of the endpoint in `WithEnvironment``1`.",
+ "returns": "An `EndpointReference` that can be used to resolve the address of the endpoint after resource allocation has occurred.",
"kind": "Method",
"signature": "getEndpoint(name: string): EndpointReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint."
}
],
"returnType": "EndpointReference",
@@ -11391,15 +11640,17 @@
"name": "onResourceEndpointsAllocated",
"capabilityId": "Aspire.Hosting/onResourceEndpointsAllocated",
"qualifiedName": "onResourceEndpointsAllocated",
- "description": "Subscribes to the ResourceEndpointsAllocated event",
+ "description": "Subscribes to the ResourceEndpointsAllocated event.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "onResourceEndpointsAllocated(callback: (arg: ResourceEndpointsAllocatedEvent) =\u003E Promise\u003Cvoid\u003E): IResourceWithEndpoints",
+ "signature": "onResourceEndpointsAllocated(callback: (arg: ResourceEndpointsAllocatedEvent) => Promise): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: ResourceEndpointsAllocatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: ResourceEndpointsAllocatedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11417,7 +11668,8 @@
"name": "withEndpoint",
"capabilityId": "Aspire.Hosting/withEndpoint",
"qualifiedName": "withEndpoint",
- "description": "Adds a network endpoint",
+ "description": "Exposes an endpoint on a resource. A reference to this endpoint can be retrieved using `GetEndpoint``1`. The endpoint name will be the scheme name if not specified.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: ProtocolType): IResourceWithEndpoints",
"parameters": [
@@ -11425,46 +11677,54 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional port. This is the port that will be given to other resource to communicate with this resource."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "scheme",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional scheme e.g. (http/https). Defaults to the `protocol` argument if it is defined or \"tcp\" otherwise."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to the scheme name if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable that will be used to inject the `targetPort`. If the target port is null one will be dynamically generated and assigned to the environment variable."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
},
{
"name": "isExternal",
"type": "boolean",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "Indicates that this endpoint should be exposed externally at publish time."
},
{
"name": "protocol",
"type": "ProtocolType",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "Network protocol: TCP or UDP are supported today, others possibly in future."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11484,7 +11744,7 @@
"qualifiedName": "withEndpointCallback",
"description": "Updates a named endpoint via callback",
"kind": "Method",
- "signature": "withEndpointCallback(endpointName: string, callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withEndpointCallback(endpointName: string, callback: (obj: EndpointUpdateContext) => Promise, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "endpointName",
@@ -11494,7 +11754,7 @@
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "createIfNotExists",
@@ -11518,7 +11778,8 @@
"name": "withExternalHttpEndpoints",
"capabilityId": "Aspire.Hosting/withExternalHttpEndpoints",
"qualifiedName": "withExternalHttpEndpoints",
- "description": "Makes HTTP endpoints externally accessible",
+ "description": "Marks existing http or https endpoints on a resource as external.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withExternalHttpEndpoints(): IResourceWithEndpoints",
"parameters": [],
@@ -11570,7 +11831,9 @@
"name": "withHttpEndpoint",
"capabilityId": "Aspire.Hosting/withHttpEndpoint",
"qualifiedName": "withHttpEndpoint",
- "description": "Adds an HTTP endpoint",
+ "description": "Exposes an HTTP endpoint on a resource, or updates the existing HTTP endpoint if one with the same name already exists. This endpoint reference can be retrieved using `GetEndpoint``1`. The endpoint name will be \"http\" if not specified.",
+ "remarks": "If an endpoint with the same name already exists on the resource, the existing endpoint is updated\nwith any non-null parameter values. Parameters left as `null` will not modify the existing endpoint's values.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpEndpoint(port?: number, targetPort?: number, name?: string, env?: string, isProxied?: boolean): IResourceWithEndpoints",
"parameters": [
@@ -11578,29 +11841,34 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional port. This is the port that will be given to other resource to communicate with this resource."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to \"http\" if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable to inject."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11620,13 +11888,13 @@
"qualifiedName": "withHttpEndpointCallback",
"description": "Updates an HTTP endpoint via callback",
"kind": "Method",
- "signature": "withHttpEndpointCallback(callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withHttpEndpointCallback(callback: (obj: EndpointUpdateContext) => Promise, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "name",
@@ -11655,25 +11923,30 @@
"name": "withHttpHealthCheck",
"capabilityId": "Aspire.Hosting/withHttpHealthCheck",
"qualifiedName": "withHttpHealthCheck",
- "description": "Adds an HTTP health check",
+ "description": "Adds a health check to the resource which is mapped to a specific endpoint.",
+ "remarks": "This method adds a health check to the health check service which polls the specified endpoint on the resource\non a periodic basis. The base address is dynamically determined based on the endpoint that was selected. By\ndefault the path is set to \"/\" and the status code is set to 200.\nThis example shows adding an HTTP health check to a backend project.\nThe health check makes sure that the front end does not start until the backend is\nreporting a healthy status based on the return code returned from the\n\"/health\" path on the backend server.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar backend = builder.AddProject(\"backend\")\n.WithHttpHealthCheck(\"/health\");\nbuilder.AddProject(\"frontend\")\n.WithReference(backend).WaitFor(backend);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpHealthCheck(path?: string, statusCode?: number, endpointName?: string): IResourceWithEndpoints",
"parameters": [
{
"name": "path",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The relative path to test."
},
{
"name": "statusCode",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "The result code to interpret as healthy."
},
{
"name": "endpointName",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the endpoint to derive the base address from."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11691,7 +11964,7 @@
"name": "withHttpProbe",
"capabilityId": "Aspire.Hosting/withHttpProbe",
"qualifiedName": "withHttpProbe",
- "description": "Adds an HTTP health probe to the resource",
+ "description": "ATS export stub for `WithHttpProbe``1` with renamed parameter to avoid reserved keyword conflicts in Go and Rust.",
"kind": "Method",
"signature": "withHttpProbe(probeType: ProbeType, path?: string, initialDelaySeconds?: number, periodSeconds?: number, timeoutSeconds?: number, failureThreshold?: number, successThreshold?: number, endpointName?: string): IResourceWithEndpoints",
"parameters": [
@@ -11755,7 +12028,9 @@
"name": "withHttpsEndpoint",
"capabilityId": "Aspire.Hosting/withHttpsEndpoint",
"qualifiedName": "withHttpsEndpoint",
- "description": "Adds an HTTPS endpoint",
+ "description": "Exposes an HTTPS endpoint on a resource, or updates the existing HTTPS endpoint if one with the same name already exists. This endpoint reference can be retrieved using `GetEndpoint``1`. The endpoint name will be \"https\" if not specified.",
+ "remarks": "If an endpoint with the same name already exists on the resource, the existing endpoint is updated\nwith any non-null parameter values. Parameters left as `null` will not modify the existing endpoint's values.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpsEndpoint(port?: number, targetPort?: number, name?: string, env?: string, isProxied?: boolean): IResourceWithEndpoints",
"parameters": [
@@ -11763,29 +12038,34 @@
"name": "port",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "An optional host port."
},
{
"name": "targetPort",
"type": "number",
"isOptional": true,
- "isNullable": true
+ "isNullable": true,
+ "description": "This is the port the resource is listening on. If the endpoint is used for the container, it is the container port."
},
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint. Defaults to \"https\" if not specified."
},
{
"name": "env",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the environment variable to inject."
},
{
"name": "isProxied",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Specifies if the endpoint will be proxied by DCP. Defaults to true."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11805,13 +12085,13 @@
"qualifiedName": "withHttpsEndpointCallback",
"description": "Updates an HTTPS endpoint via callback",
"kind": "Method",
- "signature": "withHttpsEndpointCallback(callback: (obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
+ "signature": "withHttpsEndpointCallback(callback: (obj: EndpointUpdateContext) => Promise, name?: string, createIfNotExists?: boolean): IResourceWithEndpoints",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: EndpointUpdateContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: EndpointUpdateContext) => Promise"
},
{
"name": "name",
@@ -11840,7 +12120,9 @@
"name": "withMcpServer",
"capabilityId": "Aspire.Hosting/withMcpServer",
"qualifiedName": "withMcpServer",
- "description": "Configures an MCP server endpoint on the resource",
+ "description": "Marks the resource as hosting a Model Context Protocol (MCP) server on the specified endpoint.",
+ "remarks": "This method adds an `McpServerEndpointAnnotation` to the resource, enabling the Aspire tooling\nto discover and proxy the MCP server exposed by the resource.",
+ "returns": "A reference to the `IResourceBuilder`1` for chaining additional configuration.",
"kind": "Method",
"signature": "withMcpServer(path?: string, endpointName?: string): IResourceWithEndpoints",
"parameters": [
@@ -11848,12 +12130,14 @@
"name": "path",
"type": "string",
"isOptional": true,
- "defaultValue": "/mcp"
+ "defaultValue": "/mcp",
+ "description": "An optional path to append to the endpoint URL when forming the MCP server address. Defaults to `\"/mcp\"`."
},
{
"name": "endpointName",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "An optional name of the endpoint that hosts the MCP server. If not specified, defaults to the first HTTPS or HTTP endpoint."
}
],
"returnType": "IResourceWithEndpoints",
@@ -11874,19 +12158,23 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithEnvironment",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that is associated with an environment.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "withCertificateTrustScope",
"capabilityId": "Aspire.Hosting/withCertificateTrustScope",
"qualifiedName": "withCertificateTrustScope",
- "description": "Sets the certificate trust scope",
+ "description": "Sets the `CertificateTrustScope` for custom certificate authorities associated with the resource. The scope specifies how custom certificate authorities should be applied to a resource at run time in local development scenarios. Custom certificate trust is only applied in run mode; in publish mode resources will use their default certificate trust behavior.",
+ "remarks": "The default scope if not overridden is `Append` which means that custom certificate\nauthorities should be appended to the default trusted certificate authorities for the resource. Setting the scope to\n`Override` indicates the set of certificates in referenced\n`CertificateAuthorityCollection` (and optionally Aspire developer certificiates) should be used as the\nexclusive source of trust for a resource.\nIn all cases, this is a best effort implementation as not all resources support full customization of certificate\ntrust.\nSet the scope for custom certificate authorities to override the default trusted certificate authorities for a container resource.\n```\nvar caCollection = builder.AddCertificateAuthorityCollection(\"my-cas\")\n.WithCertificate(new X509Certificate2(\"my-ca.pem\"));\nvar container = builder.AddContainer(\"my-service\", \"my-service:latest\")\n.WithCertificateAuthorityCollection(caCollection)\n.WithCertificateTrustScope(CertificateTrustScope.Override);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withCertificateTrustScope(scope: CertificateTrustScope): IResourceWithEnvironment",
"parameters": [
{
"name": "scope",
- "type": "CertificateTrustScope"
+ "type": "CertificateTrustScope",
+ "description": "The scope to apply to custom certificate authorities associated with the resource."
}
],
"returnType": "IResourceWithEnvironment",
@@ -11904,13 +12192,16 @@
"name": "withDeveloperCertificateTrust",
"capabilityId": "Aspire.Hosting/withDeveloperCertificateTrust",
"qualifiedName": "withDeveloperCertificateTrust",
- "description": "Configures developer certificate trust",
+ "description": "Indicates whether developer certificates should be treated as trusted certificate authorities for the resource at run time. Currently this indicates trust for the ASP.NET Core developer certificate. The developer certificate will only be trusted when running in local development scenarios; in publish mode resources will use their default certificate trust.",
+ "remarks": "Disable trust for app host managed developer certificate(s) for a container resource.\n```\nvar container = builder.AddContainer(\"my-service\", \"my-service:latest\")\n.WithDeveloperCertificateTrust(false);\n```\nDisable automatic trust for app host managed developer certificate(s), but explicitly enable it for a specific resource.\n```\nvar builder = DistributedApplication.CreateBuilder(new DistributedApplicationOptions()\n{\nArgs = args,\nTrustDeveloperCertificate = false,\n});\nvar project = builder.AddProject(\"my-service\")\n.WithDeveloperCertificateTrust(true);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withDeveloperCertificateTrust(trust: boolean): IResourceWithEnvironment",
"parameters": [
{
"name": "trust",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Indicates whether the developer certificate should be treated as trusted."
}
],
"returnType": "IResourceWithEnvironment",
@@ -11956,15 +12247,17 @@
"name": "withEnvironmentCallback",
"capabilityId": "Aspire.Hosting/withEnvironmentCallback",
"qualifiedName": "withEnvironmentCallback",
- "description": "Sets environment variables via callback",
+ "description": "Allows for the population of environment variables on a resource.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "withEnvironmentCallback(callback: (arg: EnvironmentCallbackContext) =\u003E Promise\u003Cvoid\u003E): IResourceWithEnvironment",
+ "signature": "withEnvironmentCallback(callback: (arg: EnvironmentCallbackContext) => Promise): IResourceWithEnvironment",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EnvironmentCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EnvironmentCallbackContext) => Promise",
+ "description": "A callback that allows for deferred execution for computing many environment variables. This runs after resources have been allocated by the orchestrator and allows access to other resources to resolve computed data, e.g. connection strings, ports."
}
],
"returnType": "IResourceWithEnvironment",
@@ -11982,14 +12275,17 @@
"name": "withHttpsDeveloperCertificate",
"capabilityId": "Aspire.Hosting/withParameterHttpsDeveloperCertificate",
"qualifiedName": "withHttpsDeveloperCertificate",
- "description": "Configures HTTPS with a developer certificate",
+ "description": "Indicates that a resource should use the developer certificate key pair for HTTPS endpoints at run time. Currently this indicates use of the ASP.NET Core developer certificate. The developer certificate will only be used when running in local development scenarios; in publish mode resources will use their default certificate configuration.",
+ "remarks": "Use the developer certificate for HTTPS/TLS endpoints on a container resource:\n```\nbuilder.AddContainer(\"my-service\", \"my-image\")\n.WithHttpsDeveloperCertificate()\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHttpsDeveloperCertificate(password?: ParameterResource): IResourceWithEnvironment",
"parameters": [
{
"name": "password",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "A parameter specifying the password used to encrypt the certificate private key."
}
],
"returnType": "IResourceWithEnvironment",
@@ -12033,7 +12329,9 @@
"name": "withoutHttpsCertificate",
"capabilityId": "Aspire.Hosting/withoutHttpsCertificate",
"qualifiedName": "withoutHttpsCertificate",
- "description": "Removes HTTPS certificate configuration",
+ "description": "Disable HTTPS/TLS server certificate configuration for the resource. No HTTPS/TLS termination configuration will be applied.",
+ "remarks": "Disable HTTPS certificate configuration for a Redis resource:\n```\nvar redis = builder.AddRedis(\"cache\")\n.WithoutHttpsCertificate();\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withoutHttpsCertificate(): IResourceWithEnvironment",
"parameters": [],
@@ -12092,13 +12390,15 @@
"name": "withReferenceEnvironment",
"capabilityId": "Aspire.Hosting/withReferenceEnvironment",
"qualifiedName": "withReferenceEnvironment",
- "description": "Configures which reference values are injected into environment variables",
+ "description": "Configures how information is injected into environment variables when the resource references other resources.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withReferenceEnvironment(options: ReferenceEnvironmentInjectionOptions): IResourceWithEnvironment",
"parameters": [
{
"name": "options",
- "type": "ReferenceEnvironmentInjectionOptions"
+ "type": "ReferenceEnvironmentInjectionOptions",
+ "description": "Options controlling which reference information is emitted."
}
],
"returnType": "IResourceWithEnvironment",
@@ -12119,6 +12419,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithParent",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that has a parent resource.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -12127,6 +12428,7 @@
"fullName": "Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that can wait for other resources to be running, health, and/or completed.",
"implementedInterfaces": [],
"capabilities": [
{
@@ -12163,19 +12465,23 @@
"name": "waitForCompletion",
"capabilityId": "Aspire.Hosting/waitForResourceCompletion",
"qualifiedName": "waitForCompletion",
- "description": "Waits for resource completion",
+ "description": "Waits for the dependency resource to enter the Exited or Finished state before starting the resource.",
+ "remarks": "This method is useful when a resource should wait until another has completed. A common usage pattern\nwould be to include a console application that initializes the database schema or performs other one off\ninitialization tasks.\nNote that this method has no impact at deployment time and only works for local development.\nWait for database initialization app to complete running.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar pgsql = builder.AddPostgres(\"postgres\");\nvar dbprep = builder.AddProject(\"dbprep\")\n.WithReference(pgsql);\nbuilder.AddProject(\"dbpreptool\")\n.WithReference(pgsql)\n.WaitForCompletion(dbprep);\n```",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "waitForCompletion(dependency: IResource, exitCode?: number): IResourceWithWaitSupport",
"parameters": [
{
"name": "dependency",
- "type": "IResource"
+ "type": "IResource",
+ "description": "The resource builder for the dependency resource."
},
{
"name": "exitCode",
"type": "number",
"isOptional": true,
- "defaultValue": "0"
+ "defaultValue": "0",
+ "description": "The exit code which is interpreted as successful."
}
],
"returnType": "IResourceWithWaitSupport",
@@ -12225,19 +12531,21 @@
"name": "LogFacade",
"fullName": "Aspire.Hosting.ApplicationModel.LogFacade",
"kind": "handle",
+ "description": "Provides a narrow logging surface for polyglot callback contexts.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "debug",
"capabilityId": "Aspire.Hosting.ApplicationModel/debug",
"qualifiedName": "LogFacade.debug",
- "description": "Writes a debug log message",
+ "description": "Writes a debug log message.",
"kind": "InstanceMethod",
"signature": "debug(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -12250,13 +12558,14 @@
"name": "error",
"capabilityId": "Aspire.Hosting.ApplicationModel/error",
"qualifiedName": "LogFacade.error",
- "description": "Writes an error log message",
+ "description": "Writes an error log message.",
"kind": "InstanceMethod",
"signature": "error(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -12269,13 +12578,14 @@
"name": "info",
"capabilityId": "Aspire.Hosting.ApplicationModel/info",
"qualifiedName": "LogFacade.info",
- "description": "Writes an informational log message",
+ "description": "Writes an informational log message.",
"kind": "InstanceMethod",
"signature": "info(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -12288,13 +12598,14 @@
"name": "warning",
"capabilityId": "Aspire.Hosting.ApplicationModel/warning",
"qualifiedName": "LogFacade.warning",
- "description": "Writes a warning log message",
+ "description": "Writes a warning log message.",
"kind": "InstanceMethod",
"signature": "warning(message: string): void",
"parameters": [
{
"name": "message",
- "type": "string"
+ "type": "string",
+ "description": "The message to write."
}
],
"returnType": "void",
@@ -12309,6 +12620,7 @@
"name": "ParameterResource",
"fullName": "Aspire.Hosting.ApplicationModel.ParameterResource",
"kind": "handle",
+ "description": "Represents a parameter resource.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IExpressionValue",
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
@@ -12320,19 +12632,22 @@
"name": "withDescription",
"capabilityId": "Aspire.Hosting/withDescription",
"qualifiedName": "withDescription",
- "description": "Sets a parameter description",
+ "description": "Sets the description of the parameter resource.",
+ "returns": "Resource builder for the parameter.",
"kind": "Method",
"signature": "withDescription(description: string, enableMarkdown?: boolean): ParameterResource",
"parameters": [
{
"name": "description",
- "type": "string"
+ "type": "string",
+ "description": "The parameter description."
},
{
"name": "enableMarkdown",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "A value indicating whether the description should be rendered as Markdown. `true` allows the description to contain Markdown elements such as links, text decoration and lists."
}
],
"returnType": "ParameterResource",
@@ -12348,6 +12663,7 @@
"name": "ProjectResource",
"fullName": "Aspire.Hosting.ApplicationModel.ProjectResource",
"kind": "handle",
+ "description": "A resource that represents a specified .NET project.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IComputeResource",
"Aspire.Hosting.ApplicationModel.IContainerFilesDestinationResource",
@@ -12364,7 +12680,9 @@
"name": "disableForwardedHeaders",
"capabilityId": "Aspire.Hosting/disableForwardedHeaders",
"qualifiedName": "disableForwardedHeaders",
- "description": "Disables forwarded headers for the project",
+ "description": "Configures the project to disable forwarded headers when being published.",
+ "remarks": "By default Aspire assumes that .NET applications which expose endpoints should be configured to\nuse forwarded headers. This is because most typical cloud native deployment scenarios involve a reverse\nproxy which translates an external endpoint hostname to an internal address.\nTo enable forwarded headers the `ASPNETCORE_FORWARDEDHEADERS_ENABLED` variable is injected\ninto the project and set to true. If the `DisableForwardedHeaders`\nextension is used this environment variable will not be set.\nDisable forwarded headers for a project.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddProject(\"inventoryservice\")\n.DisableForwardedHeaders();\n```",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "disableForwardedHeaders(): ProjectResource",
"parameters": [],
@@ -12380,16 +12698,19 @@
"name": "publishAsDockerFile",
"capabilityId": "Aspire.Hosting/publishProjectAsDockerFileWithConfigure",
"qualifiedName": "publishAsDockerFile",
- "description": "Publishes a project as a Docker file with optional container configuration",
+ "description": "Adds support for containerizing this `ProjectResource` during deployment. The resulting container image is built, and when the optional `configure` action is provided, it is used to configure the container resource.",
+ "remarks": "When the executable resource is converted to a container resource, the arguments to the executable\nare not used. This is because arguments to the project often contain physical paths that are not valid\nin the container. The container can be set up with the correct arguments using the `configure` action.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "publishAsDockerFile(configure?: (obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E): ProjectResource",
+ "signature": "publishAsDockerFile(configure?: (obj: ContainerResource) => Promise): ProjectResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(obj: ContainerResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: ContainerResource) => Promise",
+ "description": "Optional action to configure the container resource"
}
],
"returnType": "ProjectResource",
@@ -12404,13 +12725,16 @@
"name": "withReplicas",
"capabilityId": "Aspire.Hosting/withReplicas",
"qualifiedName": "withReplicas",
- "description": "Sets the number of replicas",
+ "description": "Configures how many replicas of the project should be created for the project.",
+ "remarks": "When this method is applied to a project resource it will configure the app host to start multiple instances\nof the application based on the specified number of replicas. By default the app host automatically starts a\nreverse proxy for each process. When `WithReplicas` is\nused the reverse proxy will load balance traffic between the replicas.\nThis capability can be useful when debugging scale out scenarios to ensure state is appropriately managed\nwithin a cluster of instances.\nStart multiple instances of the same service.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddProject(\"inventoryservice\")\n.WithReplicas(3);\n```",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withReplicas(replicas: number): ProjectResource",
"parameters": [
{
"name": "replicas",
- "type": "number"
+ "type": "number",
+ "description": "The number of replicas."
}
],
"returnType": "ProjectResource",
@@ -12427,6 +12751,8 @@
"name": "ReferenceExpression",
"fullName": "Aspire.Hosting.ApplicationModel.ReferenceExpression",
"kind": "handle",
+ "description": "Represents an expression that might be made up of multiple resource properties. For example, a connection string might be made up of a host, port, and password from different endpoints.",
+ "remarks": "A `ReferenceExpression` operates in one of two modes:\n-\n-",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IExpressionValue",
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
@@ -12438,13 +12764,14 @@
"name": "getValueAsync",
"capabilityId": "Aspire.Hosting.ApplicationModel/getValueAsync",
"qualifiedName": "ReferenceExpression.getValueAsync",
- "description": "Gets the resolved string value of the reference expression asynchronously",
+ "description": "Gets the value of the expression. The final string value after evaluating the format string and its parameters.",
"kind": "InstanceMethod",
"signature": "getValueAsync(cancellationToken: cancellationToken): string",
"parameters": [
{
"name": "cancellationToken",
- "type": "cancellationToken"
+ "type": "cancellationToken",
+ "description": "A `CancellationToken`."
}
],
"returnType": "string",
@@ -12460,24 +12787,27 @@
"fullName": "Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder",
"kind": "handle",
"exposeProperties": true,
+ "description": "A builder for creating `ReferenceExpression` instances.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "appendFormatted",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendFormatted",
"qualifiedName": "ReferenceExpressionBuilder.appendFormatted",
- "description": "Appends a formatted string value to the reference expression",
+ "description": "Appends a formatted value to the expression.",
"kind": "InstanceMethod",
"signature": "appendFormatted(value: string, format?: string): void",
"parameters": [
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The formatted string to be appended to the interpolated string."
},
{
"name": "format",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The format to be applied to the value. e.g., \"uri\""
}
],
"returnType": "void",
@@ -12490,13 +12820,14 @@
"name": "appendLiteral",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendLiteral",
"qualifiedName": "ReferenceExpressionBuilder.appendLiteral",
- "description": "Appends a literal string to the reference expression",
+ "description": "Appends a literal value to the expression.",
"kind": "InstanceMethod",
"signature": "appendLiteral(value: string): void",
"parameters": [
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The literal string value to be appended to the interpolated string."
}
],
"returnType": "void",
@@ -12509,18 +12840,20 @@
"name": "appendValueProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/appendValueProvider",
"qualifiedName": "ReferenceExpressionBuilder.appendValueProvider",
- "description": "Appends a value provider to the reference expression",
+ "description": "Appends a value provider to the expression using late binding. The object must implement both `IValueProvider` and `IManifestExpressionProvider`, or be an `IResourceBuilder`1` where T implements both interfaces.",
"kind": "InstanceMethod",
"signature": "appendValueProvider(valueProvider: any, format?: string): void",
"parameters": [
{
"name": "valueProvider",
- "type": "any"
+ "type": "any",
+ "description": "An object that implements both interfaces, or an IResourceBuilder wrapping such an object."
},
{
"name": "format",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional format specifier."
}
],
"returnType": "void",
@@ -12533,7 +12866,7 @@
"name": "build",
"capabilityId": "Aspire.Hosting.ApplicationModel/build",
"qualifiedName": "ReferenceExpressionBuilder.build",
- "description": "Builds the reference expression",
+ "description": "Builds the `ReferenceExpression`.",
"kind": "InstanceMethod",
"signature": "build(): ReferenceExpression",
"parameters": [],
@@ -12547,7 +12880,7 @@
"name": "isEmpty",
"capabilityId": "Aspire.Hosting.ApplicationModel/ReferenceExpressionBuilder.isEmpty",
"qualifiedName": "ReferenceExpressionBuilder.isEmpty",
- "description": "Gets the IsEmpty property",
+ "description": "Indicates whether the expression is empty.",
"kind": "PropertyGetter",
"signature": "isEmpty(): boolean",
"parameters": [],
@@ -12564,6 +12897,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is raised by orchestrators to signal to resources that their endpoints have been allocated.",
+ "remarks": "Any resources that customize their URLs via a `ResourceUrlsCallbackAnnotation` will have their callbacks invoked during this event.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -12603,6 +12938,7 @@
"name": "ResourceLoggerService",
"fullName": "Aspire.Hosting.ApplicationModel.ResourceLoggerService",
"kind": "handle",
+ "description": "A service that provides loggers for resources to write to.",
"implementedInterfaces": [
"System.IDisposable"
],
@@ -12611,7 +12947,7 @@
"name": "completeLog",
"capabilityId": "Aspire.Hosting/completeLog",
"qualifiedName": "completeLog",
- "description": "Completes the log stream for a resource",
+ "description": "Completes the log stream for a resource.",
"kind": "Method",
"signature": "completeLog(resource: IResource): void",
"parameters": [
@@ -12630,7 +12966,7 @@
"name": "completeLogByName",
"capabilityId": "Aspire.Hosting/completeLogByName",
"qualifiedName": "completeLogByName",
- "description": "Completes the log stream by resource name",
+ "description": "Completes the log stream by resource name.",
"kind": "Method",
"signature": "completeLogByName(resourceName: string): void",
"parameters": [
@@ -12651,6 +12987,7 @@
"name": "ResourceNotificationService",
"fullName": "Aspire.Hosting.ApplicationModel.ResourceNotificationService",
"kind": "handle",
+ "description": "A service that allows publishing and subscribing to changes in the state of a resource.",
"implementedInterfaces": [
"System.IDisposable"
],
@@ -12659,7 +12996,7 @@
"name": "publishResourceUpdate",
"capabilityId": "Aspire.Hosting/publishResourceUpdate",
"qualifiedName": "publishResourceUpdate",
- "description": "Publishes an update for a resource\u0027s state",
+ "description": "Publishes an update for a resource's state.",
"kind": "Method",
"signature": "publishResourceUpdate(resource: IResource, state?: string, stateStyle?: string): void",
"parameters": [
@@ -12688,7 +13025,7 @@
"name": "tryGetResourceState",
"capabilityId": "Aspire.Hosting/tryGetResourceState",
"qualifiedName": "tryGetResourceState",
- "description": "Tries to get the current state of a resource",
+ "description": "Tries to get the current state of a resource.",
"kind": "Method",
"signature": "tryGetResourceState(resourceName: string): ResourceEventDto",
"parameters": [
@@ -12707,7 +13044,7 @@
"name": "waitForDependencies",
"capabilityId": "Aspire.Hosting/waitForDependencies",
"qualifiedName": "waitForDependencies",
- "description": "Waits for all dependencies of a resource to be ready",
+ "description": "Waits for all dependencies of a resource to be ready.",
"kind": "Method",
"signature": "waitForDependencies(resource: IResource): void",
"parameters": [
@@ -12726,7 +13063,7 @@
"name": "waitForResourceHealthy",
"capabilityId": "Aspire.Hosting/waitForResourceHealthy",
"qualifiedName": "waitForResourceHealthy",
- "description": "Waits for a resource to become healthy",
+ "description": "Waits for a resource to become healthy.",
"kind": "Method",
"signature": "waitForResourceHealthy(resourceName: string): ResourceEventDto",
"parameters": [
@@ -12745,7 +13082,7 @@
"name": "waitForResourceState",
"capabilityId": "Aspire.Hosting/waitForResourceState",
"qualifiedName": "waitForResourceState",
- "description": "Waits for a resource to reach a specified state",
+ "description": "Waits for a resource to reach a specified state.",
"kind": "Method",
"signature": "waitForResourceState(resourceName: string, targetState?: string): void",
"parameters": [
@@ -12769,7 +13106,7 @@
"name": "waitForResourceStates",
"capabilityId": "Aspire.Hosting/waitForResourceStates",
"qualifiedName": "waitForResourceStates",
- "description": "Waits for a resource to reach one of the specified states",
+ "description": "Waits for a resource to reach one of the specified states.",
"kind": "Method",
"signature": "waitForResourceStates(resourceName: string, targetStates: string[]): string",
"parameters": [
@@ -12795,6 +13132,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.ResourceReadyEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "Event that is raised when a resource initially transitions to a ready state.",
+ "remarks": "This event is only fired the first time a resource transitions to a ready state after starting.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -12804,7 +13143,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceReadyEvent.resource",
"qualifiedName": "ResourceReadyEvent.resource",
- "description": "Gets the Resource property",
+ "description": "The resource that is in a healthy state.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -12835,6 +13174,8 @@
"fullName": "Aspire.Hosting.ApplicationModel.ResourceStoppedEvent",
"kind": "handle",
"exposeProperties": true,
+ "description": "This event is raised after a resource has stopped.",
+ "remarks": "This event allows for cleanup or unregistration logic when a resource is stopped by an orchestrator.",
"implementedInterfaces": [
"Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent"
@@ -12874,13 +13215,14 @@
"name": "ResourceUrlsCallbackContext",
"fullName": "Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext",
"kind": "handle",
+ "description": "Represents a callback context for resource URLs.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.executionContext",
"qualifiedName": "ResourceUrlsCallbackContext.executionContext",
- "description": "Gets the execution context for this callback invocation",
+ "description": "Gets the execution context associated with this invocation of the AppHost.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -12894,13 +13236,14 @@
"name": "getEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/getEndpoint",
"qualifiedName": "ResourceUrlsCallbackContext.getEndpoint",
- "description": "Gets an endpoint reference from the associated resource",
+ "description": "Gets an endpoint reference from `Resource` for the specified endpoint name. If `Resource` does not implement `IResourceWithEndpoints` then returns `null`.",
"kind": "InstanceMethod",
"signature": "getEndpoint(name: string): EndpointReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the endpoint."
}
],
"returnType": "EndpointReference",
@@ -12913,7 +13256,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.log",
"qualifiedName": "ResourceUrlsCallbackContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -12927,7 +13270,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.resource",
"qualifiedName": "ResourceUrlsCallbackContext.resource",
- "description": "Gets the resource associated with these URLs",
+ "description": "Gets the resource this the URLs are associated with.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -12941,7 +13284,7 @@
"name": "urls",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.urls",
"qualifiedName": "ResourceUrlsCallbackContext.urls",
- "description": "Gets the URL editor",
+ "description": "Gets the editor used to manipulate displayed URLs in polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "urls(): ResourceUrlsEditor",
"parameters": [],
@@ -12957,24 +13300,27 @@
"name": "ResourceUrlsEditor",
"fullName": "Aspire.Hosting.ApplicationModel.ResourceUrlsEditor",
"kind": "handle",
+ "description": "Provides an ATS-first editor for resource URLs within polyglot callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "add",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.add",
"qualifiedName": "ResourceUrlsEditor.add",
- "description": "Adds a displayed URL",
+ "description": "Adds a displayed URL.",
"kind": "InstanceMethod",
"signature": "add(url: ReferenceExpression, displayText?: string): void",
"parameters": [
{
"name": "url",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The URL to add, specified as a string or reference expression."
},
{
"name": "displayText",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The optional display text to show for the URL."
}
],
"returnType": "void",
@@ -12987,22 +13333,25 @@
"name": "addForEndpoint",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.addForEndpoint",
"qualifiedName": "ResourceUrlsEditor.addForEndpoint",
- "description": "Adds a displayed URL for a specific endpoint",
+ "description": "Adds a displayed URL for a specific endpoint.",
"kind": "InstanceMethod",
"signature": "addForEndpoint(endpoint: EndpointReference, url: ReferenceExpression, displayText?: string): void",
"parameters": [
{
"name": "endpoint",
- "type": "EndpointReference"
+ "type": "EndpointReference",
+ "description": "The endpoint the URL is associated with."
},
{
"name": "url",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The URL to add, specified as a string or reference expression."
},
{
"name": "displayText",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The optional display text to show for the URL."
}
],
"returnType": "void",
@@ -13015,7 +13364,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.ApplicationModel/ResourceUrlsEditor.executionContext",
"qualifiedName": "ResourceUrlsEditor.executionContext",
- "description": "Gets the execution context for this URL editor",
+ "description": "Gets the execution context associated with this editor.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -13032,13 +13381,14 @@
"fullName": "Aspire.Hosting.ApplicationModel.UpdateCommandStateContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Context for `UpdateState`.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.serviceProvider",
"qualifiedName": "UpdateCommandStateContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The service provider.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -13047,25 +13397,6 @@
"expandedTargetTypes": [
"Aspire.Hosting.ApplicationModel.UpdateCommandStateContext"
]
- },
- {
- "name": "setServiceProvider",
- "capabilityId": "Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.setServiceProvider",
- "qualifiedName": "UpdateCommandStateContext.setServiceProvider",
- "description": "Sets the ServiceProvider property",
- "kind": "PropertySetter",
- "signature": "setServiceProvider(value: IServiceProvider): UpdateCommandStateContext",
- "parameters": [
- {
- "name": "value",
- "type": "IServiceProvider"
- }
- ],
- "returnType": "UpdateCommandStateContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.ApplicationModel.UpdateCommandStateContext"
- ]
}
]
},
@@ -13074,13 +13405,14 @@
"fullName": "Aspire.Hosting.Ats.EventingSubscriberRegistrationContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Context passed to ATS-friendly eventing subscriber registrations.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Ats/EventingSubscriberRegistrationContext.cancellationToken",
"qualifiedName": "EventingSubscriberRegistrationContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "The cancellation token associated with the subscriber registration.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -13094,7 +13426,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Ats/EventingSubscriberRegistrationContext.executionContext",
"qualifiedName": "EventingSubscriberRegistrationContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "The execution context for the AppHost invocation.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -13108,15 +13440,17 @@
"name": "onAfterResourcesCreated",
"capabilityId": "Aspire.Hosting/eventingSubscriberOnAfterResourcesCreated",
"qualifiedName": "onAfterResourcesCreated",
- "description": "Subscribes an eventing subscriber to the AfterResourcesCreated event",
+ "description": "Subscribes to the AfterResourcesCreated event from an eventing subscriber registration context.",
+ "returns": "The event subscription.",
"kind": "Method",
- "signature": "onAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "onAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: AfterResourcesCreatedEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -13129,15 +13463,17 @@
"name": "onBeforeStart",
"capabilityId": "Aspire.Hosting/eventingSubscriberOnBeforeStart",
"qualifiedName": "onBeforeStart",
- "description": "Subscribes an eventing subscriber to the BeforeStart event",
+ "description": "Subscribes to the BeforeStart event from an eventing subscriber registration context.",
+ "returns": "The event subscription.",
"kind": "Method",
- "signature": "onBeforeStart(callback: (arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "onBeforeStart(callback: (arg: BeforeStartEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeStartEvent) => Promise",
+ "description": "The callback to invoke when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -13152,6 +13488,8 @@
"name": "DistributedApplication",
"fullName": "Aspire.Hosting.DistributedApplication",
"kind": "handle",
+ "description": "Represents a distributed application that implements the `IHost` and `IAsyncDisposable` interfaces.",
+ "remarks": "The `DistributedApplication` is an implementation of the `IHost` interface that orchestrates\nan Aspire application. To build an instance of the `DistributedApplication` class, use the\n`CreateBuilder` method to create an instance of the `IDistributedApplicationBuilder`\ninterface. Using the `IDistributedApplicationBuilder` interface you can configure the resources\nthat comprise the distributed application and describe the dependencies between them.\nOnce the distributed application has been defined use the `Build` method\nto create an instance of the `DistributedApplication` class. The `DistributedApplication` class\nexposes a `Run` method which then starts the distributed application and its\nresources.\nThe `CreateBuilder` method provides additional options for\nconstructing the `IDistributedApplicationBuilder` including disabling the Aspire dashboard (see `DisableDashboard`) or\nallowing unsecured communication between the browser and dashboard, and dashboard and app host (see `AllowUnsecuredTransport`.\nThe following example shows creating a PostgreSQL server resource with a database and referencing that\ndatabase in a .NET project.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar inventoryDatabase = builder.AddPostgres(\"mypostgres\").AddDatabase(\"inventory\");\nbuilder.AddProject()\n.WithReference(inventoryDatabase);\nbuilder.Build().Run();\n```",
"implementedInterfaces": [
"Microsoft.Extensions.Hosting.IHost",
"System.IAsyncDisposable",
@@ -13162,14 +13500,17 @@
"name": "run",
"capabilityId": "Aspire.Hosting/run",
"qualifiedName": "DistributedApplication.run",
- "description": "Runs the distributed application",
+ "description": "Runs an application and returns a Task that only completes when the token is triggered or shutdown is triggered and all `IHostedService` instances are stopped.",
+ "remarks": "When the Aspire app host is launched via `RunAsync` there are\ntwo possible modes that it is running in:\n-\n-\nDevelopers extending the Aspire application model should consider the lifetime\nof `IHostedService` instances which are added to the dependency injection\ncontainer. For more information on determining the mode that the app host is running\nin refer to `DistributedApplicationExecutionContext`.",
+ "returns": "The `Task` that represents the asynchronous operation.",
"kind": "InstanceMethod",
"signature": "run(cancellationToken?: cancellationToken): void",
"parameters": [
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The token to trigger shutdown."
}
],
"returnType": "void",
@@ -13185,13 +13526,14 @@
"fullName": "Aspire.Hosting.DistributedApplicationExecutionContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Exposes the global contextual information for this invocation of the AppHost.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "isPublishMode",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.isPublishMode",
"qualifiedName": "DistributedApplicationExecutionContext.isPublishMode",
- "description": "Gets the IsPublishMode property",
+ "description": "Returns true if the current operation is publishing.",
"kind": "PropertyGetter",
"signature": "isPublishMode(): boolean",
"parameters": [],
@@ -13205,7 +13547,7 @@
"name": "isRunMode",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.isRunMode",
"qualifiedName": "DistributedApplicationExecutionContext.isRunMode",
- "description": "Gets the IsRunMode property",
+ "description": "Returns true if the current operation is running.",
"kind": "PropertyGetter",
"signature": "isRunMode(): boolean",
"parameters": [],
@@ -13219,7 +13561,7 @@
"name": "operation",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.operation",
"qualifiedName": "DistributedApplicationExecutionContext.operation",
- "description": "Gets the Operation property",
+ "description": "The operation currently being performed by the AppHost.",
"kind": "PropertyGetter",
"signature": "operation(): DistributedApplicationOperation",
"parameters": [],
@@ -13233,7 +13575,7 @@
"name": "publisherName",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.publisherName",
"qualifiedName": "DistributedApplicationExecutionContext.publisherName",
- "description": "Gets the PublisherName property",
+ "description": "The name of the publisher that is being used if `Operation` is set to `Publish`.",
"kind": "PropertyGetter",
"signature": "publisherName(): string",
"parameters": [],
@@ -13247,7 +13589,7 @@
"name": "serviceProvider",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.serviceProvider",
"qualifiedName": "DistributedApplicationExecutionContext.serviceProvider",
- "description": "Gets the ServiceProvider property",
+ "description": "The `IServiceProvider` for the AppHost.",
"kind": "PropertyGetter",
"signature": "serviceProvider(): IServiceProvider",
"parameters": [],
@@ -13261,7 +13603,7 @@
"name": "setPublisherName",
"capabilityId": "Aspire.Hosting/DistributedApplicationExecutionContext.setPublisherName",
"qualifiedName": "DistributedApplicationExecutionContext.setPublisherName",
- "description": "Sets the PublisherName property",
+ "description": "The name of the publisher that is being used if `Operation` is set to `Publish`.",
"kind": "PropertySetter",
"signature": "setPublisherName(value: string): DistributedApplicationExecutionContext",
"parameters": [
@@ -13282,6 +13624,7 @@
"name": "DistributedApplicationExecutionContextOptions",
"fullName": "Aspire.Hosting.DistributedApplicationExecutionContextOptions",
"kind": "handle",
+ "description": "Configuration options and references that need to be exposed to the `DistributedApplicationExecutionContext`.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -13289,6 +13632,7 @@
"name": "DistributedApplicationEventSubscription",
"fullName": "Aspire.Hosting.Eventing.DistributedApplicationEventSubscription",
"kind": "handle",
+ "description": "Represents a subscription to an event that is published during the lifecycle of the AppHost.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -13296,6 +13640,7 @@
"name": "DistributedApplicationResourceEventSubscription",
"fullName": "Aspire.Hosting.Eventing.DistributedApplicationResourceEventSubscription",
"kind": "handle",
+ "description": "Represents a subscription to an event that is published during the lifecycle of the AppHost for a specific resource.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -13304,6 +13649,7 @@
"fullName": "Aspire.Hosting.Eventing.IDistributedApplicationEvent",
"kind": "handle",
"isInterface": true,
+ "description": "Represents an event that is published during the lifecycle of the AppHost.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -13313,19 +13659,21 @@
"kind": "handle",
"isInterface": true,
"exposeMethods": true,
+ "description": "Supports publishing and subscribing to events which are executed during the AppHost lifecycle.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "unsubscribe",
"capabilityId": "Aspire.Hosting.Eventing/IDistributedApplicationEventing.unsubscribe",
"qualifiedName": "IDistributedApplicationEventing.unsubscribe",
- "description": "Invokes the Unsubscribe method",
+ "description": "Unsubscribe from an event.",
"kind": "InstanceMethod",
"signature": "unsubscribe(subscription: DistributedApplicationEventSubscription): void",
"parameters": [
{
"name": "subscription",
- "type": "DistributedApplicationEventSubscription"
+ "type": "DistributedApplicationEventSubscription",
+ "description": "The specific subscription to unsubscribe."
}
],
"returnType": "void",
@@ -13341,6 +13689,7 @@
"fullName": "Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent",
"kind": "handle",
"isInterface": true,
+ "description": "Represents an event that is published during the lifecycle of the AppHost for a specific resource.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -13356,7 +13705,7 @@
"name": "withHttpHealthCheck",
"capabilityId": "Aspire.Hosting/withExternalServiceHttpHealthCheck",
"qualifiedName": "withHttpHealthCheck",
- "description": "Adds an HTTP health check to the external service",
+ "description": "Adds an HTTP health check to the external service for polyglot app hosts.",
"kind": "Method",
"signature": "withHttpHealthCheck(path?: string, statusCode?: number, endpointName?: string): ExternalServiceResource",
"parameters": [
@@ -13391,6 +13740,8 @@
"fullName": "Aspire.Hosting.IDistributedApplicationBuilder",
"kind": "handle",
"isInterface": true,
+ "description": "A builder for creating instances of `DistributedApplication`.",
+ "remarks": "The `IDistributedApplicationBuilder` is the central interface for defining\nthe resources which are orchestrated by the `DistributedApplication` when\nthe app host is launched.\nTo create an instance of the `IDistributedApplicationBuilder` interface\ndevelopers should use the `CreateBuilder`\nmethod. Once the builder is created extension methods which target the `IDistributedApplicationBuilder`\ninterface can be used to add resources to the distributed application.\nThis example shows a distributed application that contains a .NET project (InventoryService) that uses\na Redis cache and a PostgreSQL database. The builder is created using the `CreateBuilder`\nmethod.\nThe AddRedis\nand AddPostgres\nmethods are used to add Redis and PostgreSQL container resources. The results of the methods are stored in variables for\nlater use.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nvar cache = builder.AddRedis(\"cache\");\nvar inventoryDatabase = builder.AddPostgres(\"postgres\").AddDatabase(\"inventory\");\nbuilder.AddProject(\"inventoryservice\")\n.WithReference(cache)\n.WithReference(inventory);\nbuilder.Build().Run();\n```",
"implementedInterfaces": [],
"capabilities": [
{
@@ -13422,17 +13773,20 @@
"name": "addContainer",
"capabilityId": "Aspire.Hosting/addContainer",
"qualifiedName": "addContainer",
- "description": "Adds a container resource",
+ "description": "Adds a container resource to the application.",
+ "returns": "The `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "addContainer(name: string, image: AddContainerOptions): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "image",
- "type": "AddContainerOptions"
+ "type": "AddContainerOptions",
+ "description": "The image name or image options for the container."
}
],
"returnType": "ContainerResource",
@@ -13504,27 +13858,33 @@
"name": "addDockerfile",
"capabilityId": "Aspire.Hosting/addDockerfile",
"qualifiedName": "addDockerfile",
- "description": "Adds a container resource built from a Dockerfile",
+ "description": "Adds a Dockerfile to the application model that can be treated like a container resource.",
+ "remarks": "The `contextPath` is relative to the AppHost directory unless it is a fully qualified path.\nThe `dockerfilePath` is relative to the `contextPath` unless it is a fully qualified path.\nIf the `dockerfilePath` is not provided, it defaults to \"Dockerfile\" in the `contextPath`.\nWhen generating the manifest for deployment tools, the `AddDockerfile`\nmethod results in an additional attribute being added to the `container.v1` resource type which contains the configuration\nnecessary to allow the deployment tool to build the container image prior to deployment.\nCreates a container called `mycontainer` based on a Dockerfile in the context path `path/to/context`.\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddDockerfile(\"mycontainer\", \"path/to/context\");\nbuilder.Build().Run();\n```",
+ "returns": "A `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "dockerfilePath",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Path to the Dockerfile relative to the `contextPath`. Defaults to \"Dockerfile\" if not specified."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -13538,28 +13898,34 @@
"name": "addDockerfileBuilder",
"capabilityId": "Aspire.Hosting/addDockerfileBuilder",
"qualifiedName": "addDockerfileBuilder",
- "description": "Adds a container resource built from a programmatically generated Dockerfile",
+ "description": "Adds a Dockerfile to the application model that can be treated like a container resource, with the Dockerfile generated programmatically using the `DockerfileBuilder` API.",
+ "remarks": "This method provides a programmatic way to build Dockerfiles using the `DockerfileBuilder` API\ninstead of string manipulation.\nThe `contextPath` is relative to the AppHost directory unless it is fully qualified.\nCreates a container with a programmatically built Dockerfile:\n```\nvar builder = DistributedApplication.CreateBuilder(args);\nbuilder.AddDockerfileBuilder(\"mycontainer\", \"path/to/context\", context =>\n{\ncontext.Builder.From(\"alpine:latest\")\n.WorkDir(\"/app\")\n.Copy(\".\", \".\")\n.Cmd([\"./myapp\"]);\nreturn Task.CompletedTask;\n});\nbuilder.Build().Run();\n```",
+ "returns": "A `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "addDockerfileBuilder(name: string, contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E, stage?: string): ContainerResource",
+ "signature": "addDockerfileBuilder(name: string, contextPath: string, callback: (arg: DockerfileBuilderCallbackContext) => Promise, stage?: string): ContainerResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "contextPath",
- "type": "string"
+ "type": "string",
+ "description": "Path to be used as the context for the container image build."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: DockerfileBuilderCallbackContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: DockerfileBuilderCallbackContext) => Promise",
+ "description": "A callback that uses the `DockerfileBuilder` API to construct the Dockerfile."
},
{
"name": "stage",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The stage representing the image to be published in a multi-stage Dockerfile."
}
],
"returnType": "ContainerResource",
@@ -13573,17 +13939,20 @@
"name": "addDotnetTool",
"capabilityId": "Aspire.Hosting/addDotnetTool",
"qualifiedName": "addDotnetTool",
- "description": "Adds a .NET tool resource",
+ "description": "Adds a .NET tool resource to the application model.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addDotnetTool(name: string, packageId: string): DotnetToolResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "packageId",
- "type": "string"
+ "type": "string",
+ "description": "The package id of the tool."
}
],
"returnType": "DotnetToolResource",
@@ -13597,15 +13966,16 @@
"name": "addEventingSubscriber",
"capabilityId": "Aspire.Hosting/addEventingSubscriber",
"qualifiedName": "addEventingSubscriber",
- "description": "Adds an eventing subscriber",
+ "description": "Adds an ATS-friendly eventing subscriber callback to the distributed-application builder.",
"kind": "Method",
- "signature": "addEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "addEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) => Promise): void",
"parameters": [
{
"name": "subscribe",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EventingSubscriberRegistrationContext) => Promise",
+ "description": "The callback that registers the event subscriptions."
}
],
"returnType": "void",
@@ -13618,25 +13988,31 @@
"name": "addExecutable",
"capabilityId": "Aspire.Hosting/addExecutable",
"qualifiedName": "addExecutable",
- "description": "Adds an executable resource",
+ "description": "Adds an executable resource to the application model.",
+ "remarks": "You can run any executable command using its full path.\nAs a security feature, Aspire doesn't run executable unless the command is located in a path listed in the PATH environment variable.\nTo run an executable file that's in the current directory, specify the full path or use the relative path `./` to represent the current directory.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addExecutable(name: string, command: string, workingDirectory: string, args: string[]): ExecutableResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
},
{
"name": "command",
- "type": "string"
+ "type": "string",
+ "description": "The executable path. This can be a fully qualified path or a executable to run from the shell/command line."
},
{
"name": "workingDirectory",
- "type": "string"
+ "type": "string",
+ "description": "The working directory of the executable."
},
{
"name": "args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The arguments to the executable."
}
],
"returnType": "ExecutableResource",
@@ -13711,23 +14087,27 @@
"name": "addParameterFromConfiguration",
"capabilityId": "Aspire.Hosting/addParameterFromConfiguration",
"qualifiedName": "addParameterFromConfiguration",
- "description": "Adds a parameter sourced from configuration",
+ "description": "Adds a parameter resource to the application, with a value coming from configuration.",
+ "returns": "Resource builder for the parameter.",
"kind": "Method",
"signature": "addParameterFromConfiguration(name: string, configurationKey: string, secret?: boolean): ParameterResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "Name of parameter resource"
},
{
"name": "configurationKey",
- "type": "string"
+ "type": "string",
+ "description": "Configuration key used to get the value of the parameter"
},
{
"name": "secret",
"type": "boolean",
"isOptional": true,
- "defaultValue": "False"
+ "defaultValue": "False",
+ "description": "Optional flag indicating whether the parameter should be regarded as secret."
}
],
"returnType": "ParameterResource",
@@ -13806,7 +14186,8 @@
"name": "getConfiguration",
"capabilityId": "Aspire.Hosting/getConfiguration",
"qualifiedName": "getConfiguration",
- "description": "Gets the application configuration",
+ "description": "Gets the application configuration.",
+ "returns": "The configuration handle.",
"kind": "Method",
"signature": "getConfiguration(): IConfiguration",
"parameters": [],
@@ -13820,7 +14201,7 @@
"name": "appHostDirectory",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.appHostDirectory",
"qualifiedName": "IDistributedApplicationBuilder.appHostDirectory",
- "description": "Gets the AppHostDirectory property",
+ "description": "Directory of the project where the app host is located. Defaults to the content root if there's no project.",
"kind": "PropertyGetter",
"signature": "appHostDirectory(): string",
"parameters": [],
@@ -13834,7 +14215,9 @@
"name": "build",
"capabilityId": "Aspire.Hosting/build",
"qualifiedName": "IDistributedApplicationBuilder.build",
- "description": "Builds the distributed application",
+ "description": "Builds and returns a new `DistributedApplication` instance. This can only be called once.",
+ "remarks": "Callers of the `Build` method should only call it once. are responsible for the lifecycle of the\n`DistributedApplication` instance that is returned. Note that the `DistributedApplication`\ntype implements `IDisposable` and should be disposed of when it is no longer needed. Note that in\nmany templates and samples Dispose is omitted for brevity because in those cases the instance is destroyed\nwhen the process exists.",
+ "returns": "A new `DistributedApplication` instance.",
"kind": "InstanceMethod",
"signature": "build(): DistributedApplication",
"parameters": [],
@@ -13862,7 +14245,7 @@
"name": "eventing",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.eventing",
"qualifiedName": "IDistributedApplicationBuilder.eventing",
- "description": "Gets the Eventing property",
+ "description": "Eventing infrastructure for AppHost lifecycle.",
"kind": "PropertyGetter",
"signature": "eventing(): IDistributedApplicationEventing",
"parameters": [],
@@ -13876,7 +14259,8 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.executionContext",
"qualifiedName": "IDistributedApplicationBuilder.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Execution context for this invocation of the AppHost.",
+ "remarks": "The `ExecutionContext` property provides access key information about the context\nin which the distributed application is running. The most important properties that\nthe `DistributedApplicationExecutionContext` provides is the\n`IsPublishMode` and `IsRunMode`\nproperties. Developers building Aspire based applications may whish to change the application\nmodel depending on whether they are running locally, or whether they are publishing to the cloud.\nAn example of using the `IsRunMode` property on the `IDistributedApplicationBuilder` via\nthe `ApplicationBuilder`. In this case an extension method is used to generate a stable node name for RabbitMQ for local\ndevelopment runs.\n```\nprivate static IResourceBuilder RunWithStableNodeName(this IResourceBuilder builder)\n{\nif (builder.ApplicationBuilder.ExecutionContext.IsRunMode)\n{\nbuilder.WithEnvironment(context =>\n{\n// Set a stable node name so queue storage is consistent between sessions\nvar nodeName = $\"{builder.Resource.Name}@localhost\";\ncontext.EnvironmentVariables[\"RABBITMQ_NODENAME\"] = nodeName;\n});\n}\nreturn builder;\n}\n```",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -13890,7 +14274,8 @@
"name": "pipeline",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.pipeline",
"qualifiedName": "IDistributedApplicationBuilder.pipeline",
- "description": "Gets the Pipeline property",
+ "description": "Gets the deployment pipeline for this distributed application.",
+ "remarks": "The pipeline allows adding custom deployment steps that execute during the deploy process.\nSteps can declare dependencies on other steps to control execution order.",
"kind": "PropertyGetter",
"signature": "pipeline(): IDistributedApplicationPipeline",
"parameters": [],
@@ -13904,7 +14289,8 @@
"name": "userSecretsManager",
"capabilityId": "Aspire.Hosting/IDistributedApplicationBuilder.userSecretsManager",
"qualifiedName": "IDistributedApplicationBuilder.userSecretsManager",
- "description": "Gets the UserSecretsManager property",
+ "description": "Gets the service for managing user secrets.",
+ "remarks": "The `UserSecretsManager` provides a centralized way to manage user secrets\nused by Aspire, enabling testability and consistent secret management.",
"kind": "PropertyGetter",
"signature": "userSecretsManager(): IUserSecretsManager",
"parameters": [],
@@ -13918,15 +14304,18 @@
"name": "subscribeAfterResourcesCreated",
"capabilityId": "Aspire.Hosting/subscribeAfterResourcesCreated",
"qualifiedName": "subscribeAfterResourcesCreated",
- "description": "Subscribes to the AfterResourcesCreated event",
+ "description": "Subscribes to the AfterResourcesCreated event, which fires after all resources are created.",
+ "remarks": "At this point, all resources have been instantiated but may not yet be running.\nThis is useful for performing cross-resource configuration.",
+ "returns": "A subscription handle that can be used to unsubscribe.",
"kind": "Method",
- "signature": "subscribeAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "subscribeAfterResourcesCreated(callback: (arg: AfterResourcesCreatedEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: AfterResourcesCreatedEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: AfterResourcesCreatedEvent) => Promise",
+ "description": "A callback that receives the exported event when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -13939,15 +14328,18 @@
"name": "subscribeBeforeStart",
"capabilityId": "Aspire.Hosting/subscribeBeforeStart",
"qualifiedName": "subscribeBeforeStart",
- "description": "Subscribes to the BeforeStart event",
+ "description": "Subscribes to the BeforeStart event, which fires before the application starts.",
+ "remarks": "This event provides access to the service provider and distributed application model,\nallowing you to perform final configuration or validation before resources start.",
+ "returns": "A subscription handle that can be used to unsubscribe.",
"kind": "Method",
- "signature": "subscribeBeforeStart(callback: (arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E): DistributedApplicationEventSubscription",
+ "signature": "subscribeBeforeStart(callback: (arg: BeforeStartEvent) => Promise): DistributedApplicationEventSubscription",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: BeforeStartEvent) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: BeforeStartEvent) => Promise",
+ "description": "A callback that receives the exported event when the event fires."
}
],
"returnType": "DistributedApplicationEventSubscription",
@@ -13960,15 +14352,16 @@
"name": "tryAddEventingSubscriber",
"capabilityId": "Aspire.Hosting/tryAddEventingSubscriber",
"qualifiedName": "tryAddEventingSubscriber",
- "description": "Attempts to add an eventing subscriber",
+ "description": "Attempts to add an ATS-friendly eventing subscriber callback to the distributed-application builder.",
"kind": "Method",
- "signature": "tryAddEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "tryAddEventingSubscriber(subscribe: (arg: EventingSubscriberRegistrationContext) => Promise): void",
"parameters": [
{
"name": "subscribe",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: EventingSubscriberRegistrationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: EventingSubscriberRegistrationContext) => Promise",
+ "description": "The callback that registers the event subscriptions."
}
],
"returnType": "void",
@@ -13990,7 +14383,8 @@
"name": "clearContainerFilesSources",
"capabilityId": "Aspire.Hosting/clearContainerFilesSources",
"qualifiedName": "clearContainerFilesSources",
- "description": "Clears all container file sources",
+ "description": "Removes any container files source annotation from the resource being built.",
+ "returns": "The resource builder instance with the container files source annotation applied.",
"kind": "Method",
"signature": "clearContainerFilesSources(): IResourceWithContainerFiles",
"parameters": [],
@@ -14005,13 +14399,15 @@
"name": "withContainerFilesSource",
"capabilityId": "Aspire.Hosting/withContainerFilesSource",
"qualifiedName": "withContainerFilesSource",
- "description": "Sets the source directory for container files",
+ "description": "Adds a container files source annotation to the resource being built, specifying the path to the container files source.",
+ "returns": "The resource builder instance with the container files source annotation applied.",
"kind": "Method",
"signature": "withContainerFilesSource(sourcePath: string): IResourceWithContainerFiles",
"parameters": [
{
"name": "sourcePath",
- "type": "string"
+ "type": "string",
+ "description": "The path to the container files source to associate with the resource. Cannot be null."
}
],
"returnType": "IResourceWithContainerFiles",
@@ -14030,27 +14426,31 @@
"isInterface": true,
"exposeProperties": true,
"exposeMethods": true,
+ "description": "Defines an interface for managing user secrets with support for read and write operations.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "getOrSetSecret",
"capabilityId": "Aspire.Hosting/getOrSetSecret",
"qualifiedName": "getOrSetSecret",
- "description": "Gets a secret value if it exists, or sets it to the provided value if it does not",
+ "description": "Gets a secret value if it exists in configuration, or sets it to the provided value if it does not.",
"kind": "Method",
"signature": "getOrSetSecret(resourceBuilder: IResource, name: string, value: string): void",
"parameters": [
{
"name": "resourceBuilder",
- "type": "IResource"
+ "type": "IResource",
+ "description": "A resource builder from the target application."
},
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The secret name."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The value to persist when the secret is missing."
}
],
"returnType": "void",
@@ -14063,7 +14463,7 @@
"name": "filePath",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.filePath",
"qualifiedName": "IUserSecretsManager.filePath",
- "description": "Gets the FilePath property",
+ "description": "Gets the path to the user secrets file.",
"kind": "PropertyGetter",
"signature": "filePath(): string",
"parameters": [],
@@ -14077,7 +14477,8 @@
"name": "isAvailable",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.isAvailable",
"qualifiedName": "IUserSecretsManager.isAvailable",
- "description": "Gets the IsAvailable property",
+ "description": "Gets a value indicating whether user secrets are available.",
+ "remarks": "Returns `true` if the project has a user secrets ID configured; otherwise, `false`.",
"kind": "PropertyGetter",
"signature": "isAvailable(): boolean",
"parameters": [],
@@ -14091,13 +14492,16 @@
"name": "tryDeleteSecret",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.tryDeleteSecret",
"qualifiedName": "IUserSecretsManager.tryDeleteSecret",
- "description": "Attempts to delete a user secret value",
+ "description": "Attempts to delete a user secret value synchronously.",
+ "remarks": "The default implementation returns `false` so existing implementations remain compatible.",
+ "returns": "True if the secret was deleted successfully; otherwise, false.",
"kind": "InstanceMethod",
"signature": "tryDeleteSecret(name: string): boolean",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret."
}
],
"returnType": "boolean",
@@ -14110,17 +14514,20 @@
"name": "trySetSecret",
"capabilityId": "Aspire.Hosting/IUserSecretsManager.trySetSecret",
"qualifiedName": "IUserSecretsManager.trySetSecret",
- "description": "Attempts to set a user secret value",
+ "description": "Attempts to set a user secret value synchronously.",
+ "returns": "True if the secret was set successfully; otherwise, false.",
"kind": "InstanceMethod",
"signature": "trySetSecret(name: string, value: string): boolean",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the secret."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The value of the secret."
}
],
"returnType": "boolean",
@@ -14133,18 +14540,21 @@
"name": "saveStateJson",
"capabilityId": "Aspire.Hosting/saveStateJson",
"qualifiedName": "saveStateJson",
- "description": "Saves state to user secrets from a JSON string",
+ "description": "Saves state to user secrets from a JSON string.",
+ "returns": "A task that completes when the state is saved.",
"kind": "Method",
"signature": "saveStateJson(json: string, cancellationToken?: cancellationToken): void",
"parameters": [
{
"name": "json",
- "type": "string"
+ "type": "string",
+ "description": "The JSON object payload to persist."
},
{
"name": "cancellationToken",
"type": "cancellationToken",
- "isOptional": true
+ "isOptional": true,
+ "description": "The cancellation token."
}
],
"returnType": "void",
@@ -14160,35 +14570,40 @@
"fullName": "Aspire.Hosting.Pipelines.IDistributedApplicationPipeline",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a pipeline for executing deployment steps in a distributed application.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "addStep",
"capabilityId": "Aspire.Hosting/addStep",
"qualifiedName": "addStep",
- "description": "Adds a pipeline step to the application",
+ "description": "Adds an application-level pipeline step in a TypeScript-friendly shape.",
"kind": "Method",
- "signature": "addStep(stepName: string, callback: (arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E, dependsOn?: string[], requiredBy?: string[]): void",
+ "signature": "addStep(stepName: string, callback: (arg: PipelineStepContext) => Promise, dependsOn?: string[], requiredBy?: string[]): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The unique name of the pipeline step."
},
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineStepContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineStepContext) => Promise",
+ "description": "The callback to execute when the step runs."
},
{
"name": "dependsOn",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that this step depends on."
},
{
"name": "requiredBy",
"type": "string[]",
- "isOptional": true
+ "isOptional": true,
+ "description": "Optional step names that require this step."
}
],
"returnType": "void",
@@ -14201,15 +14616,16 @@
"name": "configure",
"capabilityId": "Aspire.Hosting/configure",
"qualifiedName": "configure",
- "description": "Configures the application pipeline via a callback",
+ "description": "Registers a pipeline configuration callback in a TypeScript-friendly shape.",
"kind": "Method",
- "signature": "configure(callback: (arg: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E): void",
+ "signature": "configure(callback: (arg: PipelineConfigurationContext) => Promise): void",
"parameters": [
{
"name": "callback",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg: PipelineConfigurationContext) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg: PipelineConfigurationContext) => Promise",
+ "description": "The callback to execute during pipeline configuration."
}
],
"returnType": "void",
@@ -14222,7 +14638,9 @@
"name": "disableBuildOnlyContainerValidation",
"capabilityId": "Aspire.Hosting/disableBuildOnlyContainerValidation",
"qualifiedName": "disableBuildOnlyContainerValidation",
- "description": "Disables publish and deploy validation for unconsumed build-only containers.",
+ "description": "Disables the publish and deploy validation that requires build-only containers to be consumed by another resource.",
+ "remarks": "This is an application-wide escape hatch for scenarios where the build-only container validation is too restrictive\nfor a particular app. Prefer wiring build-only containers through `PublishWithContainerFiles` or\n`PublishWithStaticFiles` when possible.",
+ "returns": "The distributed application pipeline for chaining.",
"kind": "Method",
"signature": "disableBuildOnlyContainerValidation(): IDistributedApplicationPipeline",
"parameters": [],
@@ -14239,13 +14657,14 @@
"fullName": "Aspire.Hosting.Pipelines.IReportingStep",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a publishing step, which can contain multiple tasks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "completeStep",
"capabilityId": "Aspire.Hosting/completeStep",
"qualifiedName": "completeStep",
- "description": "Completes the reporting step with plain-text completion text",
+ "description": "Completes the reporting step with plain-text completion text.",
"kind": "Method",
"signature": "completeStep(completionText: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14275,7 +14694,7 @@
"name": "completeStepMarkdown",
"capabilityId": "Aspire.Hosting/completeStepMarkdown",
"qualifiedName": "completeStepMarkdown",
- "description": "Completes the reporting step with Markdown-formatted completion text",
+ "description": "Completes the reporting step with Markdown-formatted completion text.",
"kind": "Method",
"signature": "completeStepMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14305,7 +14724,7 @@
"name": "createMarkdownTask",
"capabilityId": "Aspire.Hosting/createMarkdownTask",
"qualifiedName": "createMarkdownTask",
- "description": "Creates a reporting task with Markdown-formatted status text",
+ "description": "Creates a reporting task with Markdown-formatted status text.",
"kind": "Method",
"signature": "createMarkdownTask(markdownString: string, cancellationToken?: cancellationToken): IReportingTask",
"parameters": [
@@ -14329,7 +14748,7 @@
"name": "createTask",
"capabilityId": "Aspire.Hosting/createTask",
"qualifiedName": "createTask",
- "description": "Creates a reporting task with plain-text status text",
+ "description": "Creates a reporting task with plain-text status text.",
"kind": "Method",
"signature": "createTask(statusText: string, cancellationToken?: cancellationToken): IReportingTask",
"parameters": [
@@ -14353,7 +14772,7 @@
"name": "logStep",
"capabilityId": "Aspire.Hosting/logStep",
"qualifiedName": "logStep",
- "description": "Logs a plain-text message for the reporting step",
+ "description": "Logs a plain-text message for the reporting step.",
"kind": "Method",
"signature": "logStep(level: string, message: string): void",
"parameters": [
@@ -14376,7 +14795,7 @@
"name": "logStepMarkdown",
"capabilityId": "Aspire.Hosting/logStepMarkdown",
"qualifiedName": "logStepMarkdown",
- "description": "Logs a Markdown-formatted message for the reporting step",
+ "description": "Logs a Markdown-formatted message for the reporting step.",
"kind": "Method",
"signature": "logStepMarkdown(level: string, markdownString: string): void",
"parameters": [
@@ -14402,13 +14821,14 @@
"fullName": "Aspire.Hosting.Pipelines.IReportingTask",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a publishing task, which belongs to a step.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "completeTask",
"capabilityId": "Aspire.Hosting/completeTask",
"qualifiedName": "completeTask",
- "description": "Completes the reporting task with plain-text completion text",
+ "description": "Completes the reporting task with plain-text completion text.",
"kind": "Method",
"signature": "completeTask(completionMessage?: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14439,7 +14859,7 @@
"name": "completeTaskMarkdown",
"capabilityId": "Aspire.Hosting/completeTaskMarkdown",
"qualifiedName": "completeTaskMarkdown",
- "description": "Completes the reporting task with Markdown-formatted completion text",
+ "description": "Completes the reporting task with Markdown-formatted completion text.",
"kind": "Method",
"signature": "completeTaskMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14469,7 +14889,7 @@
"name": "updateTask",
"capabilityId": "Aspire.Hosting/updateTask",
"qualifiedName": "updateTask",
- "description": "Updates the reporting task with plain-text status text",
+ "description": "Updates the reporting task with plain-text status text.",
"kind": "Method",
"signature": "updateTask(statusText: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14493,7 +14913,7 @@
"name": "updateTaskMarkdown",
"capabilityId": "Aspire.Hosting/updateTaskMarkdown",
"qualifiedName": "updateTaskMarkdown",
- "description": "Updates the reporting task with Markdown-formatted status text",
+ "description": "Updates the reporting task with Markdown-formatted status text.",
"kind": "Method",
"signature": "updateTaskMarkdown(markdownString: string, cancellationToken?: cancellationToken): void",
"parameters": [
@@ -14519,19 +14939,22 @@
"name": "PipelineConfigurationContext",
"fullName": "Aspire.Hosting.Pipelines.PipelineConfigurationContext",
"kind": "handle",
+ "description": "Provides contextual information for pipeline configuration callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "getSteps",
"capabilityId": "Aspire.Hosting.Pipelines/getSteps",
"qualifiedName": "PipelineConfigurationContext.getSteps",
- "description": "Gets pipeline steps with the specified tag",
+ "description": "Gets all pipeline steps with the specified tag.",
+ "returns": "A collection of steps that have the specified tag.",
"kind": "InstanceMethod",
"signature": "getSteps(tag: string): PipelineStep[]",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to search for."
}
],
"returnType": "PipelineStep[]",
@@ -14544,7 +14967,7 @@
"name": "log",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineConfigurationContext.log",
"qualifiedName": "PipelineConfigurationContext.log",
- "description": "Gets the callback logger facade",
+ "description": "Gets the logger facade used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "log(): LogFacade",
"parameters": [],
@@ -14558,7 +14981,7 @@
"name": "pipeline",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineConfigurationContext.pipeline",
"qualifiedName": "PipelineConfigurationContext.pipeline",
- "description": "Gets the pipeline editor",
+ "description": "Gets the pipeline editor used by polyglot callbacks.",
"kind": "PropertyGetter",
"signature": "pipeline(): PipelineEditor",
"parameters": [],
@@ -14575,13 +14998,14 @@
"fullName": "Aspire.Hosting.Pipelines.PipelineContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides contextual information and services for the pipeline execution process of a distributed application.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.cancellationToken",
"qualifiedName": "PipelineContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -14595,7 +15019,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.executionContext",
"qualifiedName": "PipelineContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Gets the execution context for the distributed application.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -14609,7 +15033,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.logger",
"qualifiedName": "PipelineContext.logger",
- "description": "Gets the Logger property",
+ "description": "Gets the logger for pipeline operations.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -14623,7 +15047,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.model",
"qualifiedName": "PipelineContext.model",
- "description": "Gets the Model property",
+ "description": "Gets the distributed application model to be deployed.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -14637,7 +15061,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.services",
"qualifiedName": "PipelineContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency resolution.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -14651,7 +15075,7 @@
"name": "setCancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.setCancellationToken",
"qualifiedName": "PipelineContext.setCancellationToken",
- "description": "Sets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertySetter",
"signature": "setCancellationToken(value: cancellationToken): PipelineContext",
"parameters": [
@@ -14670,7 +15094,8 @@
"name": "summary",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineContext.summary",
"qualifiedName": "PipelineContext.summary",
- "description": "Gets the Summary property",
+ "description": "Gets the pipeline summary that steps can add information to. The summary will be displayed to users after pipeline execution completes.",
+ "remarks": "Pipeline steps can add key-value pairs to the summary to provide useful information\nabout the pipeline execution, such as deployment targets, resource names, URLs, etc.",
"kind": "PropertyGetter",
"signature": "summary(): PipelineSummary",
"parameters": [],
@@ -14686,13 +15111,15 @@
"name": "PipelineEditor",
"fullName": "Aspire.Hosting.Pipelines.PipelineEditor",
"kind": "handle",
+ "description": "Provides an ATS-first editor for pipeline configuration callbacks.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "steps",
"capabilityId": "Aspire.Hosting.Pipelines/steps",
"qualifiedName": "PipelineEditor.steps",
- "description": "Gets all configured pipeline steps",
+ "description": "Gets all configured pipeline steps.",
+ "returns": "The configured pipeline steps.",
"kind": "InstanceMethod",
"signature": "steps(): PipelineStep[]",
"parameters": [],
@@ -14706,13 +15133,15 @@
"name": "stepsByTag",
"capabilityId": "Aspire.Hosting.Pipelines/stepsByTag",
"qualifiedName": "PipelineEditor.stepsByTag",
- "description": "Gets pipeline steps with the specified tag",
+ "description": "Gets all pipeline steps that have the specified tag.",
+ "returns": "The matching pipeline steps.",
"kind": "InstanceMethod",
"signature": "stepsByTag(tag: string): PipelineStep[]",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to search for."
}
],
"returnType": "PipelineStep[]",
@@ -14727,19 +15156,21 @@
"name": "PipelineStep",
"fullName": "Aspire.Hosting.Pipelines.PipelineStep",
"kind": "handle",
+ "description": "Represents a step in the deployment pipeline.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "addTag",
"capabilityId": "Aspire.Hosting.Pipelines/addTag",
"qualifiedName": "PipelineStep.addTag",
- "description": "Adds a tag to the step",
+ "description": "Adds a tag to the step.",
"kind": "InstanceMethod",
"signature": "addTag(tag: string): void",
"parameters": [
{
"name": "tag",
- "type": "string"
+ "type": "string",
+ "description": "The tag to add."
}
],
"returnType": "void",
@@ -14752,13 +15183,14 @@
"name": "dependsOn",
"capabilityId": "Aspire.Hosting.Pipelines/dependsOn",
"qualifiedName": "PipelineStep.dependsOn",
- "description": "Adds a dependency on another step by name",
+ "description": "Adds a dependency on another step.",
"kind": "InstanceMethod",
"signature": "dependsOn(stepName: string): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the step to depend on."
}
],
"returnType": "void",
@@ -14771,7 +15203,8 @@
"name": "description",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStep.description",
"qualifiedName": "PipelineStep.description",
- "description": "Gets the human-readable description of the step",
+ "description": "Gets the exported description projection for polyglot SDKs.",
+ "remarks": "This projection avoids exporting an ATS setter for the public init-only `Description` property.",
"kind": "PropertyGetter",
"signature": "description(): string",
"parameters": [],
@@ -14785,7 +15218,8 @@
"name": "name",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStep.name",
"qualifiedName": "PipelineStep.name",
- "description": "Gets the unique name of the step",
+ "description": "Gets the exported name projection for polyglot SDKs.",
+ "remarks": "This projection avoids exporting an ATS setter for the public init-only `Name` property.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -14799,13 +15233,14 @@
"name": "requiredBy",
"capabilityId": "Aspire.Hosting.Pipelines/requiredBy",
"qualifiedName": "PipelineStep.requiredBy",
- "description": "Specifies that another step requires this step by name",
+ "description": "Specifies that this step is required by another step. This creates the inverse relationship where the other step will depend on this step.",
"kind": "InstanceMethod",
"signature": "requiredBy(stepName: string): void",
"parameters": [
{
"name": "stepName",
- "type": "string"
+ "type": "string",
+ "description": "The name of the step that requires this step."
}
],
"returnType": "void",
@@ -14821,13 +15256,15 @@
"fullName": "Aspire.Hosting.Pipelines.PipelineStepContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides contextual information for a specific pipeline step execution.",
+ "remarks": "This context combines the shared pipeline context with a step-specific publishing step,\nallowing each step to track its own tasks and completion state independently.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "cancellationToken",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.cancellationToken",
"qualifiedName": "PipelineStepContext.cancellationToken",
- "description": "Gets the CancellationToken property",
+ "description": "Gets the cancellation token for the pipeline operation.",
"kind": "PropertyGetter",
"signature": "cancellationToken(): cancellationToken",
"parameters": [],
@@ -14841,7 +15278,7 @@
"name": "executionContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.executionContext",
"qualifiedName": "PipelineStepContext.executionContext",
- "description": "Gets the ExecutionContext property",
+ "description": "Gets the execution context for the distributed application.",
"kind": "PropertyGetter",
"signature": "executionContext(): DistributedApplicationExecutionContext",
"parameters": [],
@@ -14855,7 +15292,7 @@
"name": "logger",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.logger",
"qualifiedName": "PipelineStepContext.logger",
- "description": "Gets the Logger property",
+ "description": "Gets the logger for pipeline operations that writes to both the pipeline logger and the step logger.",
"kind": "PropertyGetter",
"signature": "logger(): ILogger",
"parameters": [],
@@ -14869,7 +15306,7 @@
"name": "model",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.model",
"qualifiedName": "PipelineStepContext.model",
- "description": "Gets the Model property",
+ "description": "Gets the distributed application model to be deployed.",
"kind": "PropertyGetter",
"signature": "model(): DistributedApplicationModel",
"parameters": [],
@@ -14883,7 +15320,7 @@
"name": "pipelineContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.pipelineContext",
"qualifiedName": "PipelineStepContext.pipelineContext",
- "description": "Gets the PipelineContext property",
+ "description": "Gets the pipeline context shared across all steps.",
"kind": "PropertyGetter",
"signature": "pipelineContext(): PipelineContext",
"parameters": [],
@@ -14897,7 +15334,7 @@
"name": "reportingStep",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.reportingStep",
"qualifiedName": "PipelineStepContext.reportingStep",
- "description": "Gets the ReportingStep property",
+ "description": "Gets the publishing step associated with this specific step execution.",
"kind": "PropertyGetter",
"signature": "reportingStep(): IReportingStep",
"parameters": [],
@@ -14911,7 +15348,7 @@
"name": "services",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.services",
"qualifiedName": "PipelineStepContext.services",
- "description": "Gets the Services property",
+ "description": "Gets the service provider for dependency resolution.",
"kind": "PropertyGetter",
"signature": "services(): IServiceProvider",
"parameters": [],
@@ -14921,49 +15358,12 @@
"Aspire.Hosting.Pipelines.PipelineStepContext"
]
},
- {
- "name": "setPipelineContext",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.setPipelineContext",
- "qualifiedName": "PipelineStepContext.setPipelineContext",
- "description": "Sets the PipelineContext property",
- "kind": "PropertySetter",
- "signature": "setPipelineContext(value: PipelineContext): PipelineStepContext",
- "parameters": [
- {
- "name": "value",
- "type": "PipelineContext"
- }
- ],
- "returnType": "PipelineStepContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepContext"
- ]
- },
- {
- "name": "setReportingStep",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.setReportingStep",
- "qualifiedName": "PipelineStepContext.setReportingStep",
- "description": "Sets the ReportingStep property",
- "kind": "PropertySetter",
- "signature": "setReportingStep(value: IReportingStep): PipelineStepContext",
- "parameters": [
- {
- "name": "value",
- "type": "IReportingStep"
- }
- ],
- "returnType": "PipelineStepContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepContext"
- ]
- },
{
"name": "summary",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepContext.summary",
"qualifiedName": "PipelineStepContext.summary",
- "description": "Gets the Summary property",
+ "description": "Gets the pipeline summary that steps can add information to. The summary will be displayed to users after pipeline execution completes.",
+ "remarks": "Pipeline steps can add key-value pairs to the summary to provide useful information\nabout the pipeline execution, such as deployment targets, resource names, URLs, etc.",
"kind": "PropertyGetter",
"signature": "summary(): PipelineSummary",
"parameters": [],
@@ -14980,13 +15380,14 @@
"fullName": "Aspire.Hosting.Pipelines.PipelineStepFactoryContext",
"kind": "handle",
"exposeProperties": true,
+ "description": "Provides contextual information for creating pipeline steps from a `PipelineStepAnnotation`.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "pipelineContext",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.pipelineContext",
"qualifiedName": "PipelineStepFactoryContext.pipelineContext",
- "description": "Gets the PipelineContext property",
+ "description": "Gets the pipeline context that has the model and other properties.",
"kind": "PropertyGetter",
"signature": "pipelineContext(): PipelineContext",
"parameters": [],
@@ -15000,7 +15401,7 @@
"name": "resource",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.resource",
"qualifiedName": "PipelineStepFactoryContext.resource",
- "description": "Gets the Resource property",
+ "description": "Gets the resource that this factory is associated with.",
"kind": "PropertyGetter",
"signature": "resource(): IResource",
"parameters": [],
@@ -15009,44 +15410,6 @@
"expandedTargetTypes": [
"Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
]
- },
- {
- "name": "setPipelineContext",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setPipelineContext",
- "qualifiedName": "PipelineStepFactoryContext.setPipelineContext",
- "description": "Sets the PipelineContext property",
- "kind": "PropertySetter",
- "signature": "setPipelineContext(value: PipelineContext): PipelineStepFactoryContext",
- "parameters": [
- {
- "name": "value",
- "type": "PipelineContext"
- }
- ],
- "returnType": "PipelineStepFactoryContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
- ]
- },
- {
- "name": "setResource",
- "capabilityId": "Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setResource",
- "qualifiedName": "PipelineStepFactoryContext.setResource",
- "description": "Sets the Resource property",
- "kind": "PropertySetter",
- "signature": "setResource(value: IResource): PipelineStepFactoryContext",
- "parameters": [
- {
- "name": "value",
- "type": "IResource"
- }
- ],
- "returnType": "PipelineStepFactoryContext",
- "targetTypeId": "Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext",
- "expandedTargetTypes": [
- "Aspire.Hosting.Pipelines.PipelineStepFactoryContext"
- ]
}
]
},
@@ -15055,23 +15418,27 @@
"fullName": "Aspire.Hosting.Pipelines.PipelineSummary",
"kind": "handle",
"exposeMethods": true,
+ "description": "Represents pipeline summary information to be displayed after pipeline completion. This is a general-purpose key-value collection that pipeline steps can contribute to.",
+ "remarks": "This class provides a flexible way for any pipeline step to contribute\ninformation to be displayed after pipeline execution. The data is stored as\nkey-value pairs that will be formatted as a table or list in the CLI output.\nPipeline steps can add any relevant information such as resource group names,\nsubscription IDs, URLs, namespaces, cluster names, or any other details.\nValues can be plain text or Markdown-formatted by using `MarkdownString`.\nThe summary is available via the `Summary`\nproperty and can be accessed from any pipeline step.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "addMarkdown",
"capabilityId": "Aspire.Hosting/addMarkdown",
"qualifiedName": "addMarkdown",
- "description": "Adds a Markdown-formatted value to the pipeline summary",
+ "description": "Adds a key-value pair to the pipeline summary with a Markdown-formatted value.",
"kind": "Method",
"signature": "addMarkdown(key: string, markdownString: string): void",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key or label for the item."
},
{
"name": "markdownString",
- "type": "string"
+ "type": "string",
+ "description": "The Markdown-formatted value for the item."
}
],
"returnType": "void",
@@ -15084,17 +15451,19 @@
"name": "add",
"capabilityId": "Aspire.Hosting.Pipelines/PipelineSummary.add",
"qualifiedName": "PipelineSummary.add",
- "description": "Invokes the Add method",
+ "description": "Adds a key-value pair to the pipeline summary with a plain-text value.",
"kind": "InstanceMethod",
"signature": "add(key: string, value: string): void",
"parameters": [
{
"name": "key",
- "type": "string"
+ "type": "string",
+ "description": "The key or label for the item (e.g., \"Namespace\", \"URL\")."
},
{
"name": "value",
- "type": "string"
+ "type": "string",
+ "description": "The plain-text value for the item."
}
],
"returnType": "void",
@@ -15110,13 +15479,14 @@
"fullName": "Aspire.Hosting.ProjectResourceOptions",
"kind": "handle",
"exposeProperties": true,
+ "description": "Various properties to modify the behavior of the project resource.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "excludeKestrelEndpoints",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.excludeKestrelEndpoints",
"qualifiedName": "ProjectResourceOptions.excludeKestrelEndpoints",
- "description": "Gets the ExcludeKestrelEndpoints property",
+ "description": "If set, ignore endpoints coming from Kestrel configuration.",
"kind": "PropertyGetter",
"signature": "excludeKestrelEndpoints(): boolean",
"parameters": [],
@@ -15130,7 +15500,7 @@
"name": "excludeLaunchProfile",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.excludeLaunchProfile",
"qualifiedName": "ProjectResourceOptions.excludeLaunchProfile",
- "description": "Gets the ExcludeLaunchProfile property",
+ "description": "If set, no launch profile will be used, and LaunchProfileName will be ignored.",
"kind": "PropertyGetter",
"signature": "excludeLaunchProfile(): boolean",
"parameters": [],
@@ -15144,7 +15514,7 @@
"name": "launchProfileName",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.launchProfileName",
"qualifiedName": "ProjectResourceOptions.launchProfileName",
- "description": "Gets the LaunchProfileName property",
+ "description": "The launch profile to use. If `null` then the default launch profile will be used.",
"kind": "PropertyGetter",
"signature": "launchProfileName(): string",
"parameters": [],
@@ -15158,7 +15528,7 @@
"name": "setExcludeKestrelEndpoints",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setExcludeKestrelEndpoints",
"qualifiedName": "ProjectResourceOptions.setExcludeKestrelEndpoints",
- "description": "Sets the ExcludeKestrelEndpoints property",
+ "description": "If set, ignore endpoints coming from Kestrel configuration.",
"kind": "PropertySetter",
"signature": "setExcludeKestrelEndpoints(value: boolean): ProjectResourceOptions",
"parameters": [
@@ -15177,7 +15547,7 @@
"name": "setExcludeLaunchProfile",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setExcludeLaunchProfile",
"qualifiedName": "ProjectResourceOptions.setExcludeLaunchProfile",
- "description": "Sets the ExcludeLaunchProfile property",
+ "description": "If set, no launch profile will be used, and LaunchProfileName will be ignored.",
"kind": "PropertySetter",
"signature": "setExcludeLaunchProfile(value: boolean): ProjectResourceOptions",
"parameters": [
@@ -15196,7 +15566,7 @@
"name": "setLaunchProfileName",
"capabilityId": "Aspire.Hosting/ProjectResourceOptions.setLaunchProfileName",
"qualifiedName": "ProjectResourceOptions.setLaunchProfileName",
- "description": "Sets the LaunchProfileName property",
+ "description": "The launch profile to use. If `null` then the default launch profile will be used.",
"kind": "PropertySetter",
"signature": "setLaunchProfileName(value: string): ProjectResourceOptions",
"parameters": [
@@ -15219,22 +15589,27 @@
"name": "CertificateTrustExecutionConfigurationContext",
"fullName": "Aspire.Hosting.ApplicationModel.CertificateTrustExecutionConfigurationContext",
"kind": "dto",
+ "description": "Context for configuring certificate trust configuration properties.",
"fields": [
{
"name": "CertificateBundlePath",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The path to the PEM certificate bundle file in the resource context (e.g., container filesystem)."
},
{
"name": "CertificateDirectoriesPath",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "The path(s) to the certificate directories in the resource context (e.g., container filesystem)."
},
{
"name": "RootCertificatesPath",
- "type": "string"
+ "type": "string",
+ "description": "The root path certificates will be written to in the resource context (e.g., container filesystem)."
},
{
"name": "IsContainer",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Is this request being generated for a container resource (i.e. does it require Linux style paths?)."
}
]
},
@@ -15242,34 +15617,43 @@
"name": "CommandOptions",
"fullName": "Aspire.Hosting.ApplicationModel.CommandOptions",
"kind": "dto",
+ "description": "Optional configuration for resource commands added with `WithCommand``1`.",
"fields": [
{
"name": "Description",
- "type": "string"
+ "type": "string",
+ "description": "Optional description of the command, to be shown in the UI. Could be used as a tooltip. May be localized."
},
{
"name": "Parameter",
- "type": "any"
+ "type": "any",
+ "description": "Optional parameter that configures the command in some way. Clients must return any value provided by the server when invoking the command."
},
{
"name": "ConfirmationMessage",
- "type": "string"
+ "type": "string",
+ "description": "When a confirmation message is specified, the UI will prompt with an OK/Cancel dialog and the confirmation message before starting the command."
},
{
"name": "IconName",
- "type": "string"
+ "type": "string",
+ "description": "The icon name for the command. The name should be a valid FluentUI icon name from ."
},
{
"name": "IconVariant",
- "type": "IconVariant"
+ "type": "IconVariant",
+ "isOptional": true,
+ "description": "The icon variant."
},
{
"name": "IsHighlighted",
- "type": "boolean"
+ "type": "boolean",
+ "description": "A flag indicating whether the command is highlighted in the UI."
},
{
"name": "UpdateState",
- "type": "UpdateCommandStateContext]]"
+ "type": "callback",
+ "description": "A callback that is used to update the command state. The callback is executed when the command's resource snapshot is updated. If a callback isn't specified, the command is always enabled."
}
]
},
@@ -15277,18 +15661,22 @@
"name": "CommandResultData",
"fullName": "Aspire.Hosting.ApplicationModel.CommandResultData",
"kind": "dto",
+ "description": "Represents a value produced by a command.",
"fields": [
{
"name": "Value",
- "type": "string"
+ "type": "string",
+ "description": "The value data."
},
{
"name": "Format",
- "type": "CommandResultFormat"
+ "type": "CommandResultFormat",
+ "description": "The format of the `Value` data."
},
{
"name": "DisplayImmediately",
- "type": "boolean"
+ "type": "boolean",
+ "description": "When `true`, the dashboard will immediately display the value in a dialog when the command completes."
}
]
},
@@ -15296,26 +15684,32 @@
"name": "ExecuteCommandResult",
"fullName": "Aspire.Hosting.ApplicationModel.ExecuteCommandResult",
"kind": "dto",
+ "description": "The result of executing a command. Returned from `ExecuteCommand`.",
"fields": [
{
"name": "Success",
- "type": "boolean"
+ "type": "boolean",
+ "description": "A flag that indicates whether the command was successful."
},
{
"name": "Canceled",
- "type": "boolean"
+ "type": "boolean",
+ "description": "A flag that indicates whether the command was canceled by the user."
},
{
"name": "ErrorMessage",
- "type": "string"
+ "type": "string",
+ "description": "An optional error message that can be set when the command is unsuccessful."
},
{
"name": "Message",
- "type": "string"
+ "type": "string",
+ "description": "An optional message associated with the command result."
},
{
"name": "Data",
- "type": "CommandResultData"
+ "type": "CommandResultData",
+ "description": "An optional value produced by the command."
}
]
},
@@ -15323,42 +15717,53 @@
"name": "GenerateParameterDefault",
"fullName": "Aspire.Hosting.ApplicationModel.GenerateParameterDefault",
"kind": "dto",
+ "description": "Represents that a default value should be generated.",
+ "remarks": "The recommended minimum bits of entropy for a generated password is 128 bits.\nThe general calculation of bits of entropy is:\n`log base 2 (numberPossibleOutputs)`\nThis generator uses 23 upper case, 23 lower case (excludes i,l,o,I,L,O to prevent confusion),\n10 numeric, and 11 special characters. So a total of 67 possible characters.\nWhen all character sets are enabled, the number of possible outputs is `(67 ^ length)`.\nThe minimum password length for 128 bits of entropy is 22 characters: `log base 2 (67 ^ 22)`.\nWhen character sets are disabled, it lowers the number of possible outputs and thus the bits of entropy.\nUsing MinLower, MinUpper, MinNumeric, and MinSpecial also lowers the number of possible outputs and thus the bits of entropy.\nA generalized lower-bound formula for the number of possible outputs is to consider a string of the form:\n```\n{nonRequiredCharacters}{requiredCharacters}\nlet a = MinLower, b = MinUpper, c = MinNumeric, d = MinSpecial\nlet x = length - (a + b + c + d)\nnonRequiredPossibilities = 67^x\nrequiredPossibilities = 23^a * 23^b * 10^c * 11^d * (a + b + c + d)! / (a! * b! * c! * d!)\nlower-bound of total possibilities = nonRequiredPossibilities * requiredPossibilities\n```\nPutting it all together, the lower-bound bits of entropy calculation is:\n```\nlog base 2 [67^x * 23^a * 23^b * 10^c * 11^d * (a + b + c + d)! / (a! * b! * c! * d!)]\n```",
"fields": [
{
"name": "MinLength",
- "type": "number"
+ "type": "number",
+ "description": "Gets or sets the minimum length of the generated value."
},
{
"name": "Lower",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Gets or sets a value indicating whether to include lowercase alphabet characters in the result."
},
{
"name": "Upper",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Gets or sets a value indicating whether to include uppercase alphabet characters in the result."
},
{
"name": "Numeric",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Gets or sets a value indicating whether to include numeric characters in the result."
},
{
"name": "Special",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Gets or sets a value indicating whether to include special characters in the result."
},
{
"name": "MinLower",
- "type": "number"
+ "type": "number",
+ "description": "Gets or sets the minimum number of lowercase characters in the result."
},
{
"name": "MinUpper",
- "type": "number"
+ "type": "number",
+ "description": "Gets or sets the minimum number of uppercase characters in the result."
},
{
"name": "MinNumeric",
- "type": "number"
+ "type": "number",
+ "description": "Gets or sets the minimum number of numeric characters in the result."
},
{
"name": "MinSpecial",
- "type": "number"
+ "type": "number",
+ "description": "Gets or sets the minimum number of special characters in the result."
}
]
},
@@ -15366,42 +15771,53 @@
"name": "HttpCommandExportOptions",
"fullName": "Aspire.Hosting.ApplicationModel.HttpCommandExportOptions",
"kind": "dto",
+ "description": "ATS-friendly configuration for resource HTTP commands.",
"fields": [
{
"name": "Description",
- "type": "string"
+ "type": "string",
+ "description": "Optional description of the command, to be shown in the UI."
},
{
"name": "ConfirmationMessage",
- "type": "string"
+ "type": "string",
+ "description": "When a confirmation message is specified, the UI will prompt with an OK/Cancel dialog before starting the command."
},
{
"name": "IconName",
- "type": "string"
+ "type": "string",
+ "description": "The icon name for the command."
},
{
"name": "IconVariant",
- "type": "IconVariant"
+ "type": "IconVariant",
+ "isOptional": true,
+ "description": "The icon variant."
},
{
"name": "IsHighlighted",
- "type": "boolean"
+ "type": "boolean",
+ "description": "A flag indicating whether the command is highlighted in the UI."
},
{
"name": "CommandName",
- "type": "string"
+ "type": "string",
+ "description": "Gets or sets the command name."
},
{
"name": "EndpointName",
- "type": "string"
+ "type": "string",
+ "description": "Gets or sets the HTTP endpoint name to send the request to when the command is invoked."
},
{
"name": "MethodName",
- "type": "string"
+ "type": "string",
+ "description": "Gets or sets the HTTP method name to use when sending the request."
},
{
"name": "ResultMode",
- "type": "HttpCommandResultMode"
+ "type": "HttpCommandResultMode",
+ "description": "Gets or sets how the HTTP response content should be returned as command result data."
}
]
},
@@ -15409,18 +15825,22 @@
"name": "HttpsCertificateExecutionConfigurationContext",
"fullName": "Aspire.Hosting.ApplicationModel.HttpsCertificateExecutionConfigurationContext",
"kind": "dto",
+ "description": "Configuration context for server authentication certificate configuration.",
"fields": [
{
"name": "CertificatePath",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "Expression that will resolve to the path of the server authentication certificate in PEM format. For containers this will be a path inside the container."
},
{
"name": "KeyPath",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "Expression that will resolve to the path of the server authentication certificate key in PEM format. For containers this will be a path inside the container."
},
{
"name": "PfxPath",
- "type": "ReferenceExpression"
+ "type": "ReferenceExpression",
+ "description": "Expression that will resolve to the path of the server authentication certificate in PFX format. For containers this will be a path inside the container."
}
]
},
@@ -15428,22 +15848,27 @@
"name": "ResourceUrlAnnotation",
"fullName": "Aspire.Hosting.ApplicationModel.ResourceUrlAnnotation",
"kind": "dto",
+ "description": "A URL that should be displayed for a resource.",
"fields": [
{
"name": "Url",
- "type": "string"
+ "type": "string",
+ "description": "The URL. When rendered as a link this will be used as the link target."
},
{
"name": "DisplayText",
- "type": "string"
+ "type": "string",
+ "description": "The name of the URL. When rendered as a link this will be used as the linked text."
},
{
"name": "Endpoint",
- "type": "EndpointReference"
+ "type": "EndpointReference",
+ "description": "The endpoint associated with this URL. Can be `null` if this URL is not associated with an endpoint."
},
{
"name": "DisplayLocation",
- "type": "UrlDisplayLocation"
+ "type": "UrlDisplayLocation",
+ "description": "Locations where this URL should be shown on the dashboard. Defaults to `SummaryAndDetails`."
}
]
},
@@ -15451,14 +15876,17 @@
"name": "AddContainerOptions",
"fullName": "Aspire.Hosting.Ats.AddContainerOptions",
"kind": "dto",
+ "description": "Options for configuring a container image in polyglot apphosts.",
"fields": [
{
"name": "Image",
- "type": "string"
+ "type": "string",
+ "description": "The container image name."
},
{
"name": "Tag",
- "type": "string"
+ "type": "string",
+ "description": "The container image tag."
}
]
},
@@ -15466,18 +15894,22 @@
"name": "CertificateTrustExecutionConfigurationExportData",
"fullName": "Aspire.Hosting.Ats.CertificateTrustExecutionConfigurationExportData",
"kind": "dto",
+ "description": "ATS-friendly certificate trust data returned from an execution-configuration result.",
"fields": [
{
"name": "Scope",
- "type": "CertificateTrustScope"
+ "type": "CertificateTrustScope",
+ "description": "The certificate trust scope."
},
{
"name": "CertificateSubjects",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The certificate subjects included in the trust configuration."
},
{
"name": "CustomBundlePaths",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The relative custom bundle paths."
}
]
},
@@ -15485,38 +15917,47 @@
"name": "CreateBuilderOptions",
"fullName": "Aspire.Hosting.Ats.CreateBuilderOptions",
"kind": "dto",
+ "description": "Options for creating a distributed application builder from polyglot apphosts.",
"fields": [
{
"name": "Args",
- "type": "string[]"
+ "type": "string[]",
+ "description": "The command line arguments."
},
{
"name": "ProjectDirectory",
- "type": "string"
+ "type": "string",
+ "description": "The directory containing the AppHost project file."
},
{
"name": "AppHostFilePath",
- "type": "string"
+ "type": "string",
+ "description": "The full path to the AppHost file (e.g., apphost.ts, apphost.py). Used for consistent socket path computation across CLI and AppHost."
},
{
"name": "ContainerRegistryOverride",
- "type": "string"
+ "type": "string",
+ "description": "When containers are used, use this value to override the container registry."
},
{
"name": "DisableDashboard",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Determines whether the dashboard is disabled."
},
{
"name": "DashboardApplicationName",
- "type": "string"
+ "type": "string",
+ "description": "The application name to display in the dashboard."
},
{
"name": "AllowUnsecuredTransport",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Allows the use of HTTP urls for the AppHost resource endpoint."
},
{
"name": "EnableResourceLogging",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Enables resource logging."
}
]
},
@@ -15524,34 +15965,42 @@
"name": "HttpsCertificateExecutionConfigurationExportData",
"fullName": "Aspire.Hosting.Ats.HttpsCertificateExecutionConfigurationExportData",
"kind": "dto",
+ "description": "ATS-friendly HTTPS certificate data returned from an execution-configuration result.",
"fields": [
{
"name": "Subject",
- "type": "string"
+ "type": "string",
+ "description": "The certificate subject."
},
{
"name": "Thumbprint",
- "type": "string"
+ "type": "string",
+ "description": "The certificate thumbprint."
},
{
"name": "KeyPathExpression",
- "type": "string"
+ "type": "string",
+ "description": "The expression for the key path reference."
},
{
"name": "PfxPathExpression",
- "type": "string"
+ "type": "string",
+ "description": "The expression for the PFX path reference."
},
{
"name": "IsKeyPathReferenced",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Indicates whether the key path was referenced."
},
{
"name": "IsPfxPathReferenced",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Indicates whether the PFX path was referenced."
},
{
"name": "Password",
- "type": "string"
+ "type": "string",
+ "description": "The certificate password, if any."
}
]
},
@@ -15559,18 +16008,22 @@
"name": "HttpsCertificateInfo",
"fullName": "Aspire.Hosting.Ats.HttpsCertificateInfo",
"kind": "dto",
+ "description": "ATS-friendly certificate metadata supplied to HTTPS certificate configuration callbacks.",
"fields": [
{
"name": "Subject",
- "type": "string"
+ "type": "string",
+ "description": "The certificate subject."
},
{
"name": "Issuer",
- "type": "string"
+ "type": "string",
+ "description": "The certificate issuer."
},
{
"name": "Thumbprint",
- "type": "string"
+ "type": "string",
+ "description": "The certificate thumbprint."
}
]
},
@@ -15578,22 +16031,27 @@
"name": "ReferenceEnvironmentInjectionOptions",
"fullName": "Aspire.Hosting.Ats.ReferenceEnvironmentInjectionOptions",
"kind": "dto",
+ "description": "Options that control which reference information is injected into environment variables.",
"fields": [
{
"name": "ConnectionString",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Injects the connection string environment variable."
},
{
"name": "ConnectionProperties",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Injects individual connection property environment variables."
},
{
"name": "ServiceDiscovery",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Injects service discovery environment variables."
},
{
"name": "Endpoints",
- "type": "boolean"
+ "type": "boolean",
+ "description": "Injects endpoint environment variables."
}
]
},
@@ -15601,30 +16059,38 @@
"name": "ResourceEventDto",
"fullName": "Aspire.Hosting.Ats.ResourceEventDto",
"kind": "dto",
+ "description": "DTO for resource events returned from notification service.",
"fields": [
{
"name": "ResourceName",
- "type": "string"
+ "type": "string",
+ "description": "The resource name."
},
{
"name": "ResourceId",
- "type": "string"
+ "type": "string",
+ "description": "The unique resource ID."
},
{
"name": "State",
- "type": "string"
+ "type": "string",
+ "description": "The current state text."
},
{
"name": "StateStyle",
- "type": "string"
+ "type": "string",
+ "description": "The state style (e.g., \"success\", \"warn\", \"error\")."
},
{
"name": "HealthStatus",
- "type": "string"
+ "type": "string",
+ "description": "The health status of the resource."
},
{
"name": "ExitCode",
- "type": "number"
+ "type": "number",
+ "isOptional": true,
+ "description": "The exit code if the resource has exited."
}
]
}
@@ -15634,36 +16100,83 @@
"name": "CertificateTrustScope",
"fullName": "Aspire.Hosting.ApplicationModel.CertificateTrustScope",
"kind": "enum",
+ "description": "Defines the scope of custom certificate authorities for a resource. The default scope for most resources is `Append`, but some resources may choose to override this default behavior.",
"members": [
"None",
"Append",
"Override",
"System"
+ ],
+ "memberDocs": [
+ {
+ "name": "None",
+ "description": "Disable all custom certificate authority configuration for a resource. This indicates that the resource should use its default certificate authority trust behavior without modification."
+ },
+ {
+ "name": "Append",
+ "description": "Append the specified certificate authorities to the default set of trusted CAs for a resource. Not all resources support this mode, in which case custom certificate authorities may not be applied. In that case, consider using `Override` or `System` instead. This is the default mode unless otherwise specified."
+ },
+ {
+ "name": "Override",
+ "description": "Replace the default set of trusted CAs for a resource with the specified certificate authorities. This mode indicates that only the provided custom certificate authorities should be considered trusted by the resource."
+ },
+ {
+ "name": "System",
+ "description": "Attempt to configure the resource to trust the default system certificate authorities in addition to any configured custom certificate trust. This mode is useful for resources that don't otherwise allow appending to their default trusted certificate authorities but do allow overriding the set of trusted certificates (e.g. Python, Rust, etc.)."
+ }
]
},
{
"name": "CommandResultFormat",
"fullName": "Aspire.Hosting.ApplicationModel.CommandResultFormat",
"kind": "enum",
+ "description": "Specifies the format of a command result.",
"members": [
"Text",
"Json",
"Markdown"
+ ],
+ "memberDocs": [
+ {
+ "name": "Text",
+ "description": "Plain text result."
+ },
+ {
+ "name": "Json",
+ "description": "JSON result."
+ },
+ {
+ "name": "Markdown",
+ "description": "Markdown result."
+ }
]
},
{
"name": "ContainerLifetime",
"fullName": "Aspire.Hosting.ApplicationModel.ContainerLifetime",
"kind": "enum",
+ "description": "Lifetime modes for container resources.",
"members": [
"Session",
"Persistent"
+ ],
+ "memberDocs": [
+ {
+ "name": "Session",
+ "description": "Create the resource when the app host process starts and dispose of it when the app host process shuts down."
+ },
+ {
+ "name": "Persistent",
+ "description": "Attempt to re-use a previously created resource (based on the container name) if one exists. Do not destroy the container on app host process shutdown.",
+ "remarks": "In the event that a container with the given name does not exist, a new container will always be created based on the\ncurrent `ContainerResource` configuration.\nWhen an existing container IS found, Aspire MAY re-use it based on the following criteria:\n-\n-\n-"
+ }
]
},
{
"name": "EndpointProperty",
"fullName": "Aspire.Hosting.ApplicationModel.EndpointProperty",
"kind": "enum",
+ "description": "Represents the properties of an endpoint that can be referenced.",
"members": [
"Url",
"Host",
@@ -15673,84 +16186,255 @@
"TargetPort",
"HostAndPort",
"TlsEnabled"
+ ],
+ "memberDocs": [
+ {
+ "name": "Url",
+ "description": "The entire URL of the endpoint."
+ },
+ {
+ "name": "Host",
+ "description": "The host of the endpoint."
+ },
+ {
+ "name": "IPV4Host",
+ "description": "The IPv4 address of the endpoint."
+ },
+ {
+ "name": "Port",
+ "description": "The port of the endpoint."
+ },
+ {
+ "name": "Scheme",
+ "description": "The scheme of the endpoint."
+ },
+ {
+ "name": "TargetPort",
+ "description": "The target port of the endpoint."
+ },
+ {
+ "name": "HostAndPort",
+ "description": "The host and port of the endpoint in the format `{Host}:{Port}`."
+ },
+ {
+ "name": "TlsEnabled",
+ "description": "Whether TLS is enabled on the endpoint. Returns `TrueString` or `FalseString`."
+ }
]
},
{
"name": "HttpCommandResultMode",
"fullName": "Aspire.Hosting.ApplicationModel.HttpCommandResultMode",
"kind": "enum",
+ "description": "Specifies how an HTTP command should surface the HTTP response body as command result data.",
"members": [
"None",
"Auto",
"Json",
"Text"
+ ],
+ "memberDocs": [
+ {
+ "name": "None",
+ "description": "Do not capture the HTTP response body as command result data."
+ },
+ {
+ "name": "Auto",
+ "description": "Infer the command result format from the HTTP response content type."
+ },
+ {
+ "name": "Json",
+ "description": "Return the HTTP response body as JSON command result data."
+ },
+ {
+ "name": "Text",
+ "description": "Return the HTTP response body as plain text command result data."
+ }
]
},
{
"name": "IconVariant",
"fullName": "Aspire.Hosting.ApplicationModel.IconVariant",
"kind": "enum",
+ "description": "The icon variant.",
"members": [
"Regular",
"Filled"
+ ],
+ "memberDocs": [
+ {
+ "name": "Regular",
+ "description": "Regular variant of icons."
+ },
+ {
+ "name": "Filled",
+ "description": "Filled variant of icons."
+ }
]
},
{
"name": "ImagePullPolicy",
"fullName": "Aspire.Hosting.ApplicationModel.ImagePullPolicy",
"kind": "enum",
+ "description": "Image pull policies for container resources.",
"members": [
"Default",
"Always",
"Missing",
"Never"
+ ],
+ "memberDocs": [
+ {
+ "name": "Default",
+ "description": "Default image pull policy behavior. Currently this will be the same as the default behavior for your container runtime."
+ },
+ {
+ "name": "Always",
+ "description": "Always pull the image when creating the container."
+ },
+ {
+ "name": "Missing",
+ "description": "Pull the image only if it does not already exist."
+ },
+ {
+ "name": "Never",
+ "description": "Never pull the image from the registry even if it is missing locally."
+ }
]
},
{
"name": "ProbeType",
"fullName": "Aspire.Hosting.ApplicationModel.ProbeType",
"kind": "enum",
+ "description": "Enum representing the type of probe.",
"members": [
"Startup",
"Readiness",
"Liveness"
+ ],
+ "memberDocs": [
+ {
+ "name": "Startup",
+ "description": "Startup probe."
+ },
+ {
+ "name": "Readiness",
+ "description": "Readiness probe."
+ },
+ {
+ "name": "Liveness",
+ "description": "Liveness probe."
+ }
+ ]
+ },
+ {
+ "name": "ResourceCommandState",
+ "fullName": "Aspire.Hosting.ApplicationModel.ResourceCommandState",
+ "kind": "enum",
+ "description": "The state of a resource command.",
+ "members": [
+ "Enabled",
+ "Disabled",
+ "Hidden"
+ ],
+ "memberDocs": [
+ {
+ "name": "Enabled",
+ "description": "Command is visible and enabled for use."
+ },
+ {
+ "name": "Disabled",
+ "description": "Command is visible and disabled for use."
+ },
+ {
+ "name": "Hidden",
+ "description": "Command is hidden."
+ }
]
},
{
"name": "UrlDisplayLocation",
"fullName": "Aspire.Hosting.ApplicationModel.UrlDisplayLocation",
"kind": "enum",
+ "description": "Specifies where the URL should be displayed.",
"members": [
"SummaryAndDetails",
"DetailsOnly"
+ ],
+ "memberDocs": [
+ {
+ "name": "SummaryAndDetails",
+ "description": "Show the URL in locations where either the resource summary or resource details are being displayed."
+ },
+ {
+ "name": "DetailsOnly",
+ "description": "Show the URL in locations where the full details of the resource are being displayed."
+ }
]
},
{
"name": "WaitBehavior",
"fullName": "Aspire.Hosting.ApplicationModel.WaitBehavior",
"kind": "enum",
+ "description": "Specifies the behavior of the wait.",
"members": [
"WaitOnResourceUnavailable",
"StopOnResourceUnavailable"
+ ],
+ "memberDocs": [
+ {
+ "name": "WaitOnResourceUnavailable",
+ "description": "If the resource is unavailable, continue waiting."
+ },
+ {
+ "name": "StopOnResourceUnavailable",
+ "description": "If the resource is unavailable, stop waiting."
+ }
]
},
{
"name": "DistributedApplicationOperation",
"fullName": "Aspire.Hosting.DistributedApplicationOperation",
"kind": "enum",
+ "description": "Describes the context in which the AppHost is being executed.",
"members": [
"Run",
"Publish"
+ ],
+ "memberDocs": [
+ {
+ "name": "Run",
+ "description": "AppHost is being run for the purpose of debugging locally."
+ },
+ {
+ "name": "Publish",
+ "description": "AppHost is being run for the purpose of publishing a manifest for deployment."
+ }
]
},
{
"name": "OtlpProtocol",
"fullName": "Aspire.Hosting.OtlpProtocol",
"kind": "enum",
+ "description": "Protocols available for OTLP exporters.",
"members": [
"Grpc",
"HttpProtobuf",
"HttpJson"
+ ],
+ "memberDocs": [
+ {
+ "name": "Grpc",
+ "description": "A gRPC-based OTLP exporter."
+ },
+ {
+ "name": "HttpProtobuf",
+ "description": "Http/Protobuf-based OTLP exporter."
+ },
+ {
+ "name": "HttpJson",
+ "description": "Http/JSON-based OTLP exporter."
+ }
]
}
]
diff --git a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.13.3.0.json b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.13.3.0.json
index 397757c65..1b082c59c 100644
--- a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.13.3.0.json
+++ b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.13.3.0.json
@@ -10,7 +10,8 @@
"name": "addAzureEnvironment",
"capabilityId": "Aspire.Hosting.Azure/addAzureEnvironment",
"qualifiedName": "addAzureEnvironment",
- "description": "Adds the shared Azure environment resource to the application model",
+ "description": "Adds an Azure environment resource to the application model.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addAzureEnvironment(): AzureEnvironmentResource",
"parameters": [],
@@ -25,19 +26,22 @@
"name": "addAzureInfrastructure",
"capabilityId": "Aspire.Hosting.Azure/addAzureInfrastructure",
"qualifiedName": "addAzureInfrastructure",
- "description": "Adds an Azure provisioning resource to the application model",
+ "description": "Adds an Azure provisioning resource to the application model.",
+ "returns": "A resource builder for the `AzureProvisioningResource` that can be used for further configuration.",
"kind": "Method",
- "signature": "addAzureInfrastructure(name: string, configureInfrastructure: (obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E): AzureProvisioningResource",
+ "signature": "addAzureInfrastructure(name: string, configureInfrastructure: (obj: AzureResourceInfrastructure) => Promise): AzureProvisioningResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource being added."
},
{
"name": "configureInfrastructure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: AzureResourceInfrastructure) => Promise",
+ "description": "A callback used to configure the infrastructure resource."
}
],
"returnType": "AzureProvisioningResource",
@@ -51,7 +55,8 @@
"name": "addAzureProvisioning",
"capabilityId": "Aspire.Hosting.Azure/addAzureProvisioning",
"qualifiedName": "addAzureProvisioning",
- "description": "Adds Azure provisioning services to the distributed application builder",
+ "description": "Adds support for generating Azure resources dynamically during application startup. The application must configure the appropriate Azure subscription and location before resources can be provisioned.",
+ "returns": "The distributed application builder.",
"kind": "Method",
"signature": "addAzureProvisioning(): IDistributedApplicationBuilder",
"parameters": [],
@@ -65,13 +70,16 @@
"name": "addAzureUserAssignedIdentity",
"capabilityId": "Aspire.Hosting.Azure/addAzureUserAssignedIdentity",
"qualifiedName": "addAzureUserAssignedIdentity",
- "description": "Adds an Azure user-assigned identity resource",
+ "description": "Adds an Azure user‑assigned identity resource to the application model.",
+ "remarks": "This method adds an Azure user‑assigned identity resource to the application model. It configures the\ninfrastructure for the resource and returns a builder for the resource.\nThe resource is added to the infrastructure only if the application is not in run mode.",
+ "returns": "A reference to the `IResourceBuilder`1` builder.",
"kind": "Method",
"signature": "addAzureUserAssignedIdentity(name: string): AzureUserAssignedIdentityResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
}
],
"returnType": "AzureUserAssignedIdentityResource",
@@ -85,17 +93,20 @@
"name": "addBicepTemplate",
"capabilityId": "Aspire.Hosting.Azure/addBicepTemplate",
"qualifiedName": "addBicepTemplate",
- "description": "Adds an Azure Bicep template resource from a file",
+ "description": "Adds an Azure Bicep resource to the application model.",
+ "returns": "An `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addBicepTemplate(name: string, bicepFile: string): AzureBicepResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource. This name will be used as the deployment name."
},
{
"name": "bicepFile",
- "type": "string"
+ "type": "string",
+ "description": "The path to the bicep file on disk. This path is relative to the apphost's project directory."
}
],
"returnType": "AzureBicepResource",
@@ -109,17 +120,20 @@
"name": "addBicepTemplateString",
"capabilityId": "Aspire.Hosting.Azure/addBicepTemplateString",
"qualifiedName": "addBicepTemplateString",
- "description": "Adds an Azure Bicep template resource from inline Bicep content",
+ "description": "Adds an Azure Bicep resource to the application model.",
+ "returns": "An `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addBicepTemplateString(name: string, bicepContent: string): AzureBicepResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource. This name will be used as the deployment name."
},
{
"name": "bicepContent",
- "type": "string"
+ "type": "string",
+ "description": "A string that represents a snippet of bicep."
}
],
"returnType": "AzureBicepResource",
@@ -133,18 +147,21 @@
"name": "asExisting",
"capabilityId": "Aspire.Hosting.Azure/asExisting",
"qualifiedName": "asExisting",
- "description": "Marks an Azure resource as existing in both run and publish modes",
+ "description": "Marks the resource as an existing resource in both run and publish modes.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "asExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -160,7 +177,7 @@
"name": "name",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.name",
"qualifiedName": "BicepOutputReference.name",
- "description": "Gets the Name property",
+ "description": "Name of the output.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -174,7 +191,7 @@
"name": "value",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.value",
"qualifiedName": "BicepOutputReference.value",
- "description": "Gets the Value property",
+ "description": "The value of the output.",
"kind": "PropertyGetter",
"signature": "value(): string",
"parameters": [],
@@ -188,7 +205,7 @@
"name": "valueExpression",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.valueExpression",
"qualifiedName": "BicepOutputReference.valueExpression",
- "description": "Gets the ValueExpression property",
+ "description": "The expression used in the manifest to reference the value of the output.",
"kind": "PropertyGetter",
"signature": "valueExpression(): string",
"parameters": [],
@@ -202,7 +219,9 @@
"name": "clearDefaultRoleAssignments",
"capabilityId": "Aspire.Hosting.Azure/clearDefaultRoleAssignments",
"qualifiedName": "clearDefaultRoleAssignments",
- "description": "Clears the default Azure role assignments from a resource",
+ "description": "Clears all default role assignments for the specified Azure resource.",
+ "remarks": "This method removes all default role assignments from the Azure resource. This can be useful when\nrole assignments can't be created, for example on existing resources where you don't have permission\nto create the assignments.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "clearDefaultRoleAssignments(): IAzureResource",
"parameters": [],
@@ -219,15 +238,17 @@
"name": "configureInfrastructure",
"capabilityId": "Aspire.Hosting.Azure/configureInfrastructure",
"qualifiedName": "configureInfrastructure",
- "description": "Configures the Azure provisioning infrastructure callback",
+ "description": "Configures the Azure provisioning resource `Infrastructure`.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "configureInfrastructure(configure: (obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E): AzureProvisioningResource",
+ "signature": "configureInfrastructure(configure: (obj: AzureResourceInfrastructure) => Promise): AzureProvisioningResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: AzureResourceInfrastructure) => Promise",
+ "description": "The configuration callback."
}
],
"returnType": "AzureProvisioningResource",
@@ -242,7 +263,8 @@
"name": "getBicepIdentifier",
"capabilityId": "Aspire.Hosting.Azure/getBicepIdentifier",
"qualifiedName": "getBicepIdentifier",
- "description": "Gets the normalized Bicep identifier for an Azure resource",
+ "description": "Gets the Bicep identifier for the Azure resource.",
+ "returns": "A valid Bicep identifier.",
"kind": "Method",
"signature": "getBicepIdentifier(): string",
"parameters": [],
@@ -258,13 +280,15 @@
"name": "getOutput",
"capabilityId": "Aspire.Hosting.Azure/getOutput",
"qualifiedName": "getOutput",
- "description": "Gets an output reference from an Azure Bicep template resource",
+ "description": "Gets a reference to an output from a bicep template.",
+ "returns": "A `BicepOutputReference` that represents the output.",
"kind": "Method",
"signature": "getOutput(name: string): BicepOutputReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "Name of the output."
}
],
"returnType": "BicepOutputReference",
@@ -279,7 +303,8 @@
"name": "isExisting",
"capabilityId": "Aspire.Hosting.Azure/isExisting",
"qualifiedName": "isExisting",
- "description": "Determines whether a resource is marked as existing",
+ "description": "Determines whether the Azure resource is marked as existing.",
+ "returns": "`true` if the resource is marked as existing; otherwise, `false`.",
"kind": "Method",
"signature": "isExisting(): boolean",
"parameters": [],
@@ -295,7 +320,8 @@
"name": "publishAsConnectionString",
"capabilityId": "Aspire.Hosting.Azure/publishAsConnectionString",
"qualifiedName": "publishAsConnectionString",
- "description": "Publishes an Azure resource to the manifest as a connection string",
+ "description": "Changes the resource to be published as a connection string reference in the manifest.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsConnectionString(): IAzureResource",
"parameters": [],
@@ -312,18 +338,21 @@
"name": "publishAsExisting",
"capabilityId": "Aspire.Hosting.Azure/publishAsExisting",
"qualifiedName": "publishAsExisting",
- "description": "Marks an Azure resource as existing in publish mode",
+ "description": "Marks the resource as an existing resource when the application is deployed.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "publishAsExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -339,18 +368,21 @@
"name": "runAsExisting",
"capabilityId": "Aspire.Hosting.Azure/runAsExisting",
"qualifiedName": "runAsExisting",
- "description": "Marks an Azure resource as existing in run mode",
+ "description": "Marks the resource as an existing resource when the application is running.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "runAsExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -366,13 +398,15 @@
"name": "withAzureUserAssignedIdentity",
"capabilityId": "Aspire.Hosting.Azure/withUserAssignedIdentityAzureUserAssignedIdentity",
"qualifiedName": "withAzureUserAssignedIdentity",
- "description": "Associates an Azure user-assigned identity with a compute resource",
+ "description": "Attaches an existing `AzureUserAssignedIdentityResource` to a compute resource, setting it as the target identity for the builder.",
+ "returns": "A reference to the `IResourceBuilder`1` builder.",
"kind": "Method",
"signature": "withAzureUserAssignedIdentity(identityResourceBuilder: AzureUserAssignedIdentityResource): IComputeResource",
"parameters": [
{
"name": "identityResourceBuilder",
- "type": "AzureUserAssignedIdentityResource"
+ "type": "AzureUserAssignedIdentityResource",
+ "description": "The builder for the `AzureUserAssignedIdentityResource`."
}
],
"returnType": "IComputeResource",
@@ -390,13 +424,16 @@
"name": "withLocation",
"capabilityId": "Aspire.Hosting.Azure/withLocation",
"qualifiedName": "withLocation",
- "description": "Sets the Azure location for the shared Azure environment resource",
+ "description": "Sets the location of the Azure environment resource.",
+ "remarks": "This method is used to set the location of the Azure environment resource.\nThe location is used to determine where the resources will be deployed.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withLocation(location: ParameterResource): AzureEnvironmentResource",
"parameters": [
{
"name": "location",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The Azure location."
}
],
"returnType": "AzureEnvironmentResource",
@@ -437,13 +474,16 @@
"name": "withResourceGroup",
"capabilityId": "Aspire.Hosting.Azure/withResourceGroup",
"qualifiedName": "withResourceGroup",
- "description": "Sets the Azure resource group for the shared Azure environment resource",
+ "description": "Sets the resource group name of the Azure environment resource.",
+ "remarks": "This method is used to set the resource group name of the Azure environment resource.\nThe resource group name is used to determine where the resources will be deployed.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withResourceGroup(resourceGroup: ParameterResource): AzureEnvironmentResource",
"parameters": [
{
"name": "resourceGroup",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The Azure resource group name."
}
],
"returnType": "AzureEnvironmentResource",
@@ -460,24 +500,28 @@
"fullName": "Aspire.Hosting.ApplicationModel.IAzureResource",
"kind": "handle",
"isInterface": true,
+ "description": "Represents an Azure resource, as a marker interface for `IResource`'s that can be deployed to an Azure resource group.",
"implementedInterfaces": [],
"capabilities": [
{
"name": "asExisting",
"capabilityId": "Aspire.Hosting.Azure/asExisting",
"qualifiedName": "asExisting",
- "description": "Marks an Azure resource as existing in both run and publish modes",
+ "description": "Marks the resource as an existing resource in both run and publish modes.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "asExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -493,7 +537,9 @@
"name": "clearDefaultRoleAssignments",
"capabilityId": "Aspire.Hosting.Azure/clearDefaultRoleAssignments",
"qualifiedName": "clearDefaultRoleAssignments",
- "description": "Clears the default Azure role assignments from a resource",
+ "description": "Clears all default role assignments for the specified Azure resource.",
+ "remarks": "This method removes all default role assignments from the Azure resource. This can be useful when\nrole assignments can't be created, for example on existing resources where you don't have permission\nto create the assignments.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "clearDefaultRoleAssignments(): IAzureResource",
"parameters": [],
@@ -510,7 +556,8 @@
"name": "getBicepIdentifier",
"capabilityId": "Aspire.Hosting.Azure/getBicepIdentifier",
"qualifiedName": "getBicepIdentifier",
- "description": "Gets the normalized Bicep identifier for an Azure resource",
+ "description": "Gets the Bicep identifier for the Azure resource.",
+ "returns": "A valid Bicep identifier.",
"kind": "Method",
"signature": "getBicepIdentifier(): string",
"parameters": [],
@@ -526,7 +573,8 @@
"name": "isExisting",
"capabilityId": "Aspire.Hosting.Azure/isExisting",
"qualifiedName": "isExisting",
- "description": "Determines whether a resource is marked as existing",
+ "description": "Determines whether the Azure resource is marked as existing.",
+ "returns": "`true` if the resource is marked as existing; otherwise, `false`.",
"kind": "Method",
"signature": "isExisting(): boolean",
"parameters": [],
@@ -542,7 +590,8 @@
"name": "publishAsConnectionString",
"capabilityId": "Aspire.Hosting.Azure/publishAsConnectionString",
"qualifiedName": "publishAsConnectionString",
- "description": "Publishes an Azure resource to the manifest as a connection string",
+ "description": "Changes the resource to be published as a connection string reference in the manifest.",
+ "returns": "The configured `IResourceBuilder`1`.",
"kind": "Method",
"signature": "publishAsConnectionString(): IAzureResource",
"parameters": [],
@@ -559,18 +608,21 @@
"name": "publishAsExisting",
"capabilityId": "Aspire.Hosting.Azure/publishAsExisting",
"qualifiedName": "publishAsExisting",
- "description": "Marks an Azure resource as existing in publish mode",
+ "description": "Marks the resource as an existing resource when the application is deployed.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "publishAsExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -586,18 +638,21 @@
"name": "runAsExisting",
"capabilityId": "Aspire.Hosting.Azure/runAsExisting",
"qualifiedName": "runAsExisting",
- "description": "Marks an Azure resource as existing in run mode",
+ "description": "Marks the resource as an existing resource when the application is running.",
+ "returns": "The resource builder with the existing resource annotation added.",
"kind": "Method",
"signature": "runAsExisting(name: ParameterResource, resourceGroup?: ParameterResource): IAzureResource",
"parameters": [
{
"name": "name",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The name of the existing resource as a string or parameter resource."
},
{
"name": "resourceGroup",
"type": "ParameterResource",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the existing resource group as a string or parameter resource."
}
],
"returnType": "IAzureResource",
@@ -625,13 +680,15 @@
"name": "getOutput",
"capabilityId": "Aspire.Hosting.Azure/getOutput",
"qualifiedName": "getOutput",
- "description": "Gets an output reference from an Azure Bicep template resource",
+ "description": "Gets a reference to an output from a bicep template.",
+ "returns": "A `BicepOutputReference` that represents the output.",
"kind": "Method",
"signature": "getOutput(name: string): BicepOutputReference",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "Name of the output."
}
],
"returnType": "BicepOutputReference",
@@ -683,13 +740,16 @@
"name": "withLocation",
"capabilityId": "Aspire.Hosting.Azure/withLocation",
"qualifiedName": "withLocation",
- "description": "Sets the Azure location for the shared Azure environment resource",
+ "description": "Sets the location of the Azure environment resource.",
+ "remarks": "This method is used to set the location of the Azure environment resource.\nThe location is used to determine where the resources will be deployed.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withLocation(location: ParameterResource): AzureEnvironmentResource",
"parameters": [
{
"name": "location",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The Azure location."
}
],
"returnType": "AzureEnvironmentResource",
@@ -703,13 +763,16 @@
"name": "withResourceGroup",
"capabilityId": "Aspire.Hosting.Azure/withResourceGroup",
"qualifiedName": "withResourceGroup",
- "description": "Sets the Azure resource group for the shared Azure environment resource",
+ "description": "Sets the resource group name of the Azure environment resource.",
+ "remarks": "This method is used to set the resource group name of the Azure environment resource.\nThe resource group name is used to determine where the resources will be deployed.",
+ "returns": "The `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withResourceGroup(resourceGroup: ParameterResource): AzureEnvironmentResource",
"parameters": [
{
"name": "resourceGroup",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "The Azure resource group name."
}
],
"returnType": "AzureEnvironmentResource",
@@ -735,15 +798,17 @@
"name": "configureInfrastructure",
"capabilityId": "Aspire.Hosting.Azure/configureInfrastructure",
"qualifiedName": "configureInfrastructure",
- "description": "Configures the Azure provisioning infrastructure callback",
+ "description": "Configures the Azure provisioning resource `Infrastructure`.",
+ "returns": "The resource builder.",
"kind": "Method",
- "signature": "configureInfrastructure(configure: (obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E): AzureProvisioningResource",
+ "signature": "configureInfrastructure(configure: (obj: AzureResourceInfrastructure) => Promise): AzureProvisioningResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(obj: AzureResourceInfrastructure) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: AzureResourceInfrastructure) => Promise",
+ "description": "The configuration callback."
}
],
"returnType": "AzureProvisioningResource",
@@ -761,6 +826,7 @@
"fullName": "Aspire.Hosting.Azure.AzureResourceInfrastructure",
"kind": "handle",
"exposeProperties": true,
+ "description": "An Azure Provisioning `Infrastructure` which represents the root Bicep module that is generated for an Azure resource.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -781,19 +847,20 @@
"fullName": "Aspire.Hosting.Azure.BicepOutputReference",
"kind": "handle",
"exposeProperties": true,
+ "description": "A reference to an output from a bicep template.",
"implementedInterfaces": [
"Aspire.Hosting.ApplicationModel.IExpressionValue",
"Aspire.Hosting.ApplicationModel.IManifestExpressionProvider",
"Aspire.Hosting.ApplicationModel.IValueProvider",
"Aspire.Hosting.ApplicationModel.IValueWithReferences",
- "System.IEquatable\u00601[[Aspire.Hosting.Azure.BicepOutputReference]]"
+ "System.IEquatable`1[[Aspire.Hosting.Azure.BicepOutputReference]]"
],
"capabilities": [
{
"name": "name",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.name",
"qualifiedName": "BicepOutputReference.name",
- "description": "Gets the Name property",
+ "description": "Name of the output.",
"kind": "PropertyGetter",
"signature": "name(): string",
"parameters": [],
@@ -807,7 +874,7 @@
"name": "value",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.value",
"qualifiedName": "BicepOutputReference.value",
- "description": "Gets the Value property",
+ "description": "The value of the output.",
"kind": "PropertyGetter",
"signature": "value(): string",
"parameters": [],
@@ -821,7 +888,7 @@
"name": "valueExpression",
"capabilityId": "Aspire.Hosting.Azure/BicepOutputReference.valueExpression",
"qualifiedName": "BicepOutputReference.valueExpression",
- "description": "Gets the ValueExpression property",
+ "description": "The expression used in the manifest to reference the value of the output.",
"kind": "PropertyGetter",
"signature": "valueExpression(): string",
"parameters": [],
@@ -838,6 +905,7 @@
"fullName": "Aspire.Hosting.Azure.IAzureKeyVaultResource",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a resource that represents an Azure Key Vault.",
"implementedInterfaces": [],
"capabilities": []
},
@@ -846,6 +914,7 @@
"fullName": "Aspire.Hosting.Azure.IAzureKeyVaultSecretReference",
"kind": "handle",
"isInterface": true,
+ "description": "Represents a reference to a secret in an Azure Key Vault resource.",
"implementedInterfaces": [],
"capabilities": []
}
diff --git a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppConfiguration.13.3.0.json b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppConfiguration.13.3.0.json
index 8e561cd67..1c11b4895 100644
--- a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppConfiguration.13.3.0.json
+++ b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppConfiguration.13.3.0.json
@@ -10,13 +10,16 @@
"name": "addAzureAppConfiguration",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/addAzureAppConfiguration",
"qualifiedName": "addAzureAppConfiguration",
- "description": "Adds an Azure App Configuration resource",
+ "description": "Adds an Azure App Configuration resource to the application model.",
+ "remarks": "By default references to the Azure App Configuration resource will be assigned the following roles:\n- `AppConfigurationDataOwner`\nThese can be replaced by calling `WithRoleAssignments``1`.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "addAzureAppConfiguration(name: string): AzureAppConfigurationResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource. This name will be used as the connection string name when referenced in a dependency."
}
],
"returnType": "AzureAppConfigurationResource",
@@ -30,16 +33,19 @@
"name": "runAsEmulator",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/runAsEmulator",
"qualifiedName": "runAsEmulator",
- "description": "Configures Azure App Configuration to run with the local emulator",
+ "description": "Configures an Azure App Configuration resource to be emulated. This resource requires an `AzureAppConfigurationResource` to be added to the application model.",
+ "remarks": "This version of the package defaults to the tag of the / container image.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "runAsEmulator(configureEmulator?: (obj: AzureAppConfigurationEmulatorResource) =\u003E Promise\u003Cvoid\u003E): AzureAppConfigurationResource",
+ "signature": "runAsEmulator(configureEmulator?: (obj: AzureAppConfigurationEmulatorResource) => Promise): AzureAppConfigurationResource",
"parameters": [
{
"name": "configureEmulator",
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(obj: AzureAppConfigurationEmulatorResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: AzureAppConfigurationEmulatorResource) => Promise",
+ "description": "Callback that exposes underlying container used for emulation to allow for customization."
}
],
"returnType": "AzureAppConfigurationResource",
@@ -53,14 +59,16 @@
"name": "withDataBindMount",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withDataBindMount",
"qualifiedName": "withDataBindMount",
- "description": "Adds a data bind mount for the App Configuration emulator",
+ "description": "Adds a bind mount for the storage of an Azure App Configuration emulator resource.",
+ "returns": "A builder for the `AzureAppConfigurationEmulatorResource`.",
"kind": "Method",
"signature": "withDataBindMount(path?: string): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "path",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Relative path to the AppHost where emulator storage is persisted between runs. Defaults to the path '.aace'"
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -74,14 +82,16 @@
"name": "withDataVolume",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withDataVolume",
"qualifiedName": "withDataVolume",
- "description": "Adds a data volume for the App Configuration emulator",
+ "description": "Adds a named volume for the data folder to an Azure App Configuration emulator resource.",
+ "returns": "A builder for the `AzureAppConfigurationEmulatorResource`.",
"kind": "Method",
"signature": "withDataVolume(name?: string): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the volume. Defaults to an auto-generated name based on the application and resource names."
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -95,14 +105,16 @@
"name": "withHostPort",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withHostPort",
"qualifiedName": "withHostPort",
- "description": "Sets the host port for the App Configuration emulator",
+ "description": "Configures the host port for the Azure App Configuration emulator is exposed on instead of using randomly assigned port.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHostPort(port: number): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "port",
"type": "number",
- "isNullable": true
+ "isNullable": true,
+ "description": "The port to bind on the host. If `null` is used, a random port will be assigned."
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -116,17 +128,20 @@
"name": "withRoleAssignments",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withAppConfigurationRoleAssignments",
"qualifiedName": "withRoleAssignments",
- "description": "Assigns App Configuration roles to a resource",
+ "description": "Assigns the specified roles to the given resource, granting it the necessary permissions on the target Azure App Configuration resource. This replaces the default role assignments for the resource.",
+ "returns": "The updated `IResourceBuilder`1` with the applied role assignments.",
"kind": "Method",
"signature": "withRoleAssignments(target: AzureAppConfigurationResource, roles: AzureAppConfigurationRole[]): IResource",
"parameters": [
{
"name": "target",
- "type": "AzureAppConfigurationResource"
+ "type": "AzureAppConfigurationResource",
+ "description": "The target Azure App Configuration resource."
},
{
"name": "roles",
- "type": "AzureAppConfigurationRole[]"
+ "type": "AzureAppConfigurationRole[]",
+ "description": "The App Configuration roles to be assigned."
}
],
"returnType": "IResource",
@@ -169,14 +184,16 @@
"name": "withDataBindMount",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withDataBindMount",
"qualifiedName": "withDataBindMount",
- "description": "Adds a data bind mount for the App Configuration emulator",
+ "description": "Adds a bind mount for the storage of an Azure App Configuration emulator resource.",
+ "returns": "A builder for the `AzureAppConfigurationEmulatorResource`.",
"kind": "Method",
"signature": "withDataBindMount(path?: string): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "path",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "Relative path to the AppHost where emulator storage is persisted between runs. Defaults to the path '.aace'"
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -190,14 +207,16 @@
"name": "withDataVolume",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withDataVolume",
"qualifiedName": "withDataVolume",
- "description": "Adds a data volume for the App Configuration emulator",
+ "description": "Adds a named volume for the data folder to an Azure App Configuration emulator resource.",
+ "returns": "A builder for the `AzureAppConfigurationEmulatorResource`.",
"kind": "Method",
"signature": "withDataVolume(name?: string): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "name",
"type": "string",
- "isOptional": true
+ "isOptional": true,
+ "description": "The name of the volume. Defaults to an auto-generated name based on the application and resource names."
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -211,14 +230,16 @@
"name": "withHostPort",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/withHostPort",
"qualifiedName": "withHostPort",
- "description": "Sets the host port for the App Configuration emulator",
+ "description": "Configures the host port for the Azure App Configuration emulator is exposed on instead of using randomly assigned port.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
"signature": "withHostPort(port: number): AzureAppConfigurationEmulatorResource",
"parameters": [
{
"name": "port",
"type": "number",
- "isNullable": true
+ "isNullable": true,
+ "description": "The port to bind on the host. If `null` is used, a random port will be assigned."
}
],
"returnType": "AzureAppConfigurationEmulatorResource",
@@ -251,16 +272,19 @@
"name": "runAsEmulator",
"capabilityId": "Aspire.Hosting.Azure.AppConfiguration/runAsEmulator",
"qualifiedName": "runAsEmulator",
- "description": "Configures Azure App Configuration to run with the local emulator",
+ "description": "Configures an Azure App Configuration resource to be emulated. This resource requires an `AzureAppConfigurationResource` to be added to the application model.",
+ "remarks": "This version of the package defaults to the tag of the / container image.",
+ "returns": "A reference to the `IResourceBuilder`1`.",
"kind": "Method",
- "signature": "runAsEmulator(configureEmulator?: (obj: AzureAppConfigurationEmulatorResource) =\u003E Promise\u003Cvoid\u003E): AzureAppConfigurationResource",
+ "signature": "runAsEmulator(configureEmulator?: (obj: AzureAppConfigurationEmulatorResource) => Promise): AzureAppConfigurationResource",
"parameters": [
{
"name": "configureEmulator",
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(obj: AzureAppConfigurationEmulatorResource) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(obj: AzureAppConfigurationEmulatorResource) => Promise",
+ "description": "Callback that exposes underlying container used for emulation to allow for customization."
}
],
"returnType": "AzureAppConfigurationResource",
@@ -279,6 +303,7 @@
"name": "AzureAppConfigurationRole",
"fullName": "Aspire.Hosting.AzureAppConfigurationRole",
"kind": "enum",
+ "description": "Represents Azure App Configuration roles that are compatible with the Aspire Type System (ATS).",
"members": [
"AppConfigurationDataOwner",
"AppConfigurationDataReader"
diff --git a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppContainers.13.3.0.json b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppContainers.13.3.0.json
index 391bc2354..9682b1c49 100644
--- a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppContainers.13.3.0.json
+++ b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppContainers.13.3.0.json
@@ -10,13 +10,15 @@
"name": "addAzureContainerAppEnvironment",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/addAzureContainerAppEnvironment",
"qualifiedName": "addAzureContainerAppEnvironment",
- "description": "Adds an Azure Container App Environment resource",
+ "description": "Adds a container app environment resource to the distributed application builder.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "addAzureContainerAppEnvironment(name: string): AzureContainerAppEnvironmentResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -30,17 +32,20 @@
"name": "configureCustomDomain",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/configureCustomDomain",
"qualifiedName": "configureCustomDomain",
- "description": "Configures the custom domain for the container app",
+ "description": "Configures the custom domain for the container app.",
+ "remarks": "The `ConfigureCustomDomain` extension method\nsimplifies the process of assigning a custom domain to a container app resource when it is deployed. It has no impact on local development.\nThe `ConfigureCustomDomain` method is used\nin conjunction with the `PublishAsAzureContainerApp``1`\ncallback. Assigning a custom domain to a container app resource is a multi-step process and requires multiple deployments.\nThe `ConfigureCustomDomain` method takes\ntwo arguments which are parameter resource builders. The first is a parameter that represents the custom domain and the second is a parameter that\nrepresents the name of the managed certificate provisioned via the Azure Portal\nWhen deploying with custom domains configured for the first time leave the `certificateName` parameter empty (when prompted\nby the Azure Developer CLI). Once the application is deployed successfully access to the Azure Portal to bind the custom domain to a managed SSL\ncertificate. Once the certificate is successfully provisioned, subsequent deployments of the application can use this certificate name when the\n`certificateName` is prompted.\nFor deployments triggered locally by the Azure Developer CLI the `config.json` file in the `.azure/{environment name}` path\ncan be modified with the certificate name since Azure Developer CLI will not prompt again for the value.\nThis example shows declaring two parameters to capture the custom domain and certificate name and\npassing them to the `ConfigureCustomDomain`\nmethod via the `PublishAsAzureContainerApp``1`\nextension method.\n```\nvar builder = DistributedApplication.CreateBuilder();\nvar customDomain = builder.AddParameter(\"customDomain\"); // Value provided at first deployment.\nvar certificateName = builder.AddParameter(\"certificateName\"); // Value provided at second and subsequent deployments.\nbuilder.AddProject(\"inventory\")\n.PublishAsAzureContainerApp((module, app) =>\n{\napp.ConfigureCustomDomain(customDomain, certificateName);\n});\n```",
"kind": "Method",
"signature": "configureCustomDomain(customDomain: ParameterResource, certificateName: ParameterResource): void",
"parameters": [
{
"name": "customDomain",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "A resource builder for a parameter resource capturing the name of the custom domain."
},
{
"name": "certificateName",
- "type": "ParameterResource"
+ "type": "ParameterResource",
+ "description": "A resource builder for a parameter resource capturing the name of the certificate configured in the Azure Portal."
}
],
"returnType": "void",
@@ -53,15 +58,18 @@
"name": "publishAsAzureContainerApp",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/publishContainerAsAzureContainerApp",
"qualifiedName": "publishAsAzureContainerApp",
- "description": "Configures the container resource to be published as an Azure Container App",
+ "description": "Publishes the specified container resource as a container app.",
+ "remarks": "This method checks if the application is in publish mode. If it is, it adds the necessary infrastructure\nfor container apps and applies the provided configuration action to the container app.\n```\nbuilder.AddContainer(\"name\", \"image\").PublishAsAzureContainerApp((infrastructure, app) =>\n{\n// Configure the container app here\n});\n```",
+ "returns": "The updated container resource builder.",
"kind": "Method",
- "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E): ContainerResource",
+ "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise): ContainerResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise",
+ "description": "The configuration action for the container app."
}
],
"returnType": "ContainerResource",
@@ -75,15 +83,18 @@
"name": "publishAsAzureContainerApp",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/publishExecutableAsAzureContainerApp",
"qualifiedName": "publishAsAzureContainerApp",
- "description": "Configures the executable resource to be published as an Azure Container App",
+ "description": "Publishes the specified container resource as a container app.",
+ "remarks": "This method checks if the application is in publish mode. If it is, it adds the necessary infrastructure\nfor container apps and applies the provided configuration action to the container app.\n```\nbuilder.AddNpmApp(\"name\", \"image\").PublishAsAzureContainerApp((infrastructure, app) =>\n{\n// Configure the container app here\n});\n```",
+ "returns": "The updated container resource builder.",
"kind": "Method",
- "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E): ExecutableResource",
+ "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise): ExecutableResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise",
+ "description": "The configuration action for the container app."
}
],
"returnType": "ExecutableResource",
@@ -98,15 +109,18 @@
"name": "publishAsAzureContainerApp",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/publishProjectAsAzureContainerApp",
"qualifiedName": "publishAsAzureContainerApp",
- "description": "Configures the project resource to be published as an Azure Container App",
+ "description": "Allows configuring the specified project resource as a container app.",
+ "remarks": "This method adds the necessary infrastructure for container apps to the application builder\nand applies the specified configuration to the container app.\n```\nbuilder.AddProject.PublishAsAzureContainerApp((infrastructure, app) =>\n{\n// Configure the container app here\n});\n```",
+ "returns": "The updated project resource builder.",
"kind": "Method",
- "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E): ProjectResource",
+ "signature": "publishAsAzureContainerApp(configure: (arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise): ProjectResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isCallback": true,
- "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerApp) => Promise",
+ "description": "The configuration action for the container app."
}
],
"returnType": "ProjectResource",
@@ -123,14 +137,14 @@
"qualifiedName": "publishAsAzureContainerAppJob",
"description": "Configures the compute resource as an Azure Container App Job",
"kind": "Method",
- "signature": "publishAsAzureContainerAppJob(configure?: (arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) =\u003E Promise\u003Cvoid\u003E): IComputeResource",
+ "signature": "publishAsAzureContainerAppJob(configure?: (arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) => Promise): IComputeResource",
"parameters": [
{
"name": "configure",
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) => Promise"
}
],
"returnType": "IComputeResource",
@@ -150,7 +164,7 @@
"qualifiedName": "publishAsScheduledAzureContainerAppJob",
"description": "Configures the compute resource as a scheduled Azure Container App Job",
"kind": "Method",
- "signature": "publishAsScheduledAzureContainerAppJob(cronExpression: string, configure?: (arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) =\u003E Promise\u003Cvoid\u003E): IComputeResource",
+ "signature": "publishAsScheduledAzureContainerAppJob(cronExpression: string, configure?: (arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) => Promise): IComputeResource",
"parameters": [
{
"name": "cronExpression",
@@ -161,7 +175,7 @@
"type": "callback",
"isOptional": true,
"isCallback": true,
- "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) =\u003E Promise\u003Cvoid\u003E"
+ "callbackSignature": "(arg1: AzureResourceInfrastructure, arg2: ContainerAppJob) => Promise"
}
],
"returnType": "IComputeResource",
@@ -179,7 +193,9 @@
"name": "withAzdResourceNaming",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withAzdResourceNaming",
"qualifiedName": "withAzdResourceNaming",
- "description": "Configures resources to use azd naming conventions",
+ "description": "Configures the container app environment resources to use the same naming conventions as azd.",
+ "remarks": "By default, the container app environment resources use a different naming convention than azd.\nThis method allows for reusing the previously deployed resources if the application was deployed using\nazd without calling `AddAzureContainerAppEnvironment`",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withAzdResourceNaming(): AzureContainerAppEnvironmentResource",
"parameters": [],
@@ -194,13 +210,15 @@
"name": "withAzureLogAnalyticsWorkspace",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withAzureLogAnalyticsWorkspace",
"qualifiedName": "withAzureLogAnalyticsWorkspace",
- "description": "Configures the container app environment to use a specific Log Analytics Workspace",
+ "description": "Configures the container app environment resource to use the specified Log Analytics Workspace.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withAzureLogAnalyticsWorkspace(workspaceBuilder: AzureLogAnalyticsWorkspaceResource): AzureContainerAppEnvironmentResource",
"parameters": [
{
"name": "workspaceBuilder",
- "type": "AzureLogAnalyticsWorkspaceResource"
+ "type": "AzureLogAnalyticsWorkspaceResource",
+ "description": "The resource builder for the `AzureLogAnalyticsWorkspaceResource` to use."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -214,7 +232,9 @@
"name": "withCompactResourceNaming",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withCompactResourceNaming",
"qualifiedName": "withCompactResourceNaming",
- "description": "Configures resources to use compact naming for length-constrained Azure resources",
+ "description": "Configures the container app environment to use compact resource naming that maximally preserves the `uniqueString` suffix for length-constrained Azure resources such as storage accounts.",
+ "remarks": "By default, the generated Azure resource names use long static suffixes (e.g. `storageVolume`,\n`managedStorage`) that can consume most of the 24-character storage account name limit, truncating\nthe `uniqueString(resourceGroup().id)` portion that provides cross-deployment uniqueness.\nWhen enabled, this method shortens the static portions of generated names so the full 13-character\n`uniqueString` is preserved. This prevents naming collisions when deploying multiple environments\nto different resource groups.\nThis option only affects volume-related storage resources. It does not change the naming of the\ncontainer app environment, container registry, log analytics workspace, or managed identity.\nUse `WithAzdResourceNaming` to change those names as well.",
+ "returns": "A reference to the `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withCompactResourceNaming(): AzureContainerAppEnvironmentResource",
"parameters": [],
@@ -229,7 +249,8 @@
"name": "withDashboard",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withDashboard",
"qualifiedName": "withDashboard",
- "description": "Configures whether the Aspire dashboard is included in the container app environment",
+ "description": "Configures whether the Aspire dashboard should be included in the container app environment.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withDashboard(enable?: boolean): AzureContainerAppEnvironmentResource",
"parameters": [
@@ -237,7 +258,8 @@
"name": "enable",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Whether to include the Aspire dashboard. Default is true."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -251,7 +273,9 @@
"name": "withHttpsUpgrade",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withHttpsUpgrade",
"qualifiedName": "withHttpsUpgrade",
- "description": "Configures whether HTTP endpoints are upgraded to HTTPS",
+ "description": "Configures whether HTTP endpoints should be upgraded to HTTPS in Azure Container Apps. By default, HTTP endpoints are upgraded to HTTPS for security and WebSocket compatibility.",
+ "remarks": "When disabled (`false`), HTTP endpoints will use HTTP scheme and port 80 in Azure Container Apps.\nNote that explicit ports specified for development (e.g., port 8080) are still normalized\nto standard ports (80/443) as required by Azure Container Apps.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withHttpsUpgrade(upgrade?: boolean): AzureContainerAppEnvironmentResource",
"parameters": [
@@ -259,7 +283,8 @@
"name": "upgrade",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Whether to upgrade HTTP endpoints to HTTPS. Default is true."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -290,7 +315,9 @@
"name": "withAzdResourceNaming",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withAzdResourceNaming",
"qualifiedName": "withAzdResourceNaming",
- "description": "Configures resources to use azd naming conventions",
+ "description": "Configures the container app environment resources to use the same naming conventions as azd.",
+ "remarks": "By default, the container app environment resources use a different naming convention than azd.\nThis method allows for reusing the previously deployed resources if the application was deployed using\nazd without calling `AddAzureContainerAppEnvironment`",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withAzdResourceNaming(): AzureContainerAppEnvironmentResource",
"parameters": [],
@@ -305,13 +332,15 @@
"name": "withAzureLogAnalyticsWorkspace",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withAzureLogAnalyticsWorkspace",
"qualifiedName": "withAzureLogAnalyticsWorkspace",
- "description": "Configures the container app environment to use a specific Log Analytics Workspace",
+ "description": "Configures the container app environment resource to use the specified Log Analytics Workspace.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withAzureLogAnalyticsWorkspace(workspaceBuilder: AzureLogAnalyticsWorkspaceResource): AzureContainerAppEnvironmentResource",
"parameters": [
{
"name": "workspaceBuilder",
- "type": "AzureLogAnalyticsWorkspaceResource"
+ "type": "AzureLogAnalyticsWorkspaceResource",
+ "description": "The resource builder for the `AzureLogAnalyticsWorkspaceResource` to use."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -325,7 +354,9 @@
"name": "withCompactResourceNaming",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withCompactResourceNaming",
"qualifiedName": "withCompactResourceNaming",
- "description": "Configures resources to use compact naming for length-constrained Azure resources",
+ "description": "Configures the container app environment to use compact resource naming that maximally preserves the `uniqueString` suffix for length-constrained Azure resources such as storage accounts.",
+ "remarks": "By default, the generated Azure resource names use long static suffixes (e.g. `storageVolume`,\n`managedStorage`) that can consume most of the 24-character storage account name limit, truncating\nthe `uniqueString(resourceGroup().id)` portion that provides cross-deployment uniqueness.\nWhen enabled, this method shortens the static portions of generated names so the full 13-character\n`uniqueString` is preserved. This prevents naming collisions when deploying multiple environments\nto different resource groups.\nThis option only affects volume-related storage resources. It does not change the naming of the\ncontainer app environment, container registry, log analytics workspace, or managed identity.\nUse `WithAzdResourceNaming` to change those names as well.",
+ "returns": "A reference to the `IResourceBuilder`1` for chaining.",
"kind": "Method",
"signature": "withCompactResourceNaming(): AzureContainerAppEnvironmentResource",
"parameters": [],
@@ -340,7 +371,8 @@
"name": "withDashboard",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withDashboard",
"qualifiedName": "withDashboard",
- "description": "Configures whether the Aspire dashboard is included in the container app environment",
+ "description": "Configures whether the Aspire dashboard should be included in the container app environment.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withDashboard(enable?: boolean): AzureContainerAppEnvironmentResource",
"parameters": [
@@ -348,7 +380,8 @@
"name": "enable",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Whether to include the Aspire dashboard. Default is true."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
@@ -362,7 +395,9 @@
"name": "withHttpsUpgrade",
"capabilityId": "Aspire.Hosting.Azure.AppContainers/withHttpsUpgrade",
"qualifiedName": "withHttpsUpgrade",
- "description": "Configures whether HTTP endpoints are upgraded to HTTPS",
+ "description": "Configures whether HTTP endpoints should be upgraded to HTTPS in Azure Container Apps. By default, HTTP endpoints are upgraded to HTTPS for security and WebSocket compatibility.",
+ "remarks": "When disabled (`false`), HTTP endpoints will use HTTP scheme and port 80 in Azure Container Apps.\nNote that explicit ports specified for development (e.g., port 8080) are still normalized\nto standard ports (80/443) as required by Azure Container Apps.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "withHttpsUpgrade(upgrade?: boolean): AzureContainerAppEnvironmentResource",
"parameters": [
@@ -370,7 +405,8 @@
"name": "upgrade",
"type": "boolean",
"isOptional": true,
- "defaultValue": "True"
+ "defaultValue": "True",
+ "description": "Whether to upgrade HTTP endpoints to HTTPS. Default is true."
}
],
"returnType": "AzureContainerAppEnvironmentResource",
diff --git a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppService.13.3.0.json b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppService.13.3.0.json
index dd1565867..5b60f8e1a 100644
--- a/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppService.13.3.0.json
+++ b/src/frontend/src/data/ts-modules/Aspire.Hosting.Azure.AppService.13.3.0.json
@@ -10,13 +10,15 @@
"name": "addAzureAppServiceEnvironment",
"capabilityId": "Aspire.Hosting.Azure.AppService/addAzureAppServiceEnvironment",
"qualifiedName": "addAzureAppServiceEnvironment",
- "description": "Adds an Azure App Service environment resource",
+ "description": "Adds a azure app service environment resource to the distributed application builder.",
+ "returns": "`IResourceBuilder`1`",
"kind": "Method",
"signature": "addAzureAppServiceEnvironment(name: string): AzureAppServiceEnvironmentResource",
"parameters": [
{
"name": "name",
- "type": "string"
+ "type": "string",
+ "description": "The name of the resource."
}
],
"returnType": "AzureAppServiceEnvironmentResource",
@@ -30,23 +32,27 @@
"name": "publishAsAzureAppServiceWebsite",
"capabilityId": "Aspire.Hosting.Azure.AppService/publishAsAzureAppServiceWebsite",
"qualifiedName": "publishAsAzureAppServiceWebsite",
- "description": "Publishes the compute resource as an Azure App Service website or deployment slot",
+ "description": "Publishes the specified compute resource as an Azure App Service or Azure App Service Slot.",
+ "remarks": "```\nbuilder.AddProject