| name | doc-writer |
|---|---|
| description | Guidelines for producing accurate and maintainable documentation for the Aspire documentation site. Use when writing or updating user guides, integration docs, tutorials, custom components used by docs, or documentation-related tests and validation on aspire.dev. |
This skill provides guidelines for AI coding agents to help maintainers produce accurate and easy-to-maintain documentation for the Aspire project. The aspire.dev repository is the official documentation site for Aspire, and this skill helps ensure consistent, high-quality documentation.
Location: src/frontend/src/content/docs/
Audience: Developers using Aspire for cloud-native application development
Format: Astro with MDX files
Build System: Astro (static site generator with Starlight theme)
src/frontend/src/content/docs/
├── index.mdx # Landing page
├── get-started/ # Getting started guides
│ ├── prerequisites.mdx
│ ├── install-cli.mdx
│ ├── first-app.mdx
│ └── ...
├── app-host/ # AppHost documentation
├── architecture/ # Architecture concepts
├── dashboard/ # Aspire Dashboard docs
├── deployment/ # Deployment guides
├── diagnostics/ # Diagnostics and telemetry
├── extensibility/ # Extensibility guides
├── fundamentals/ # Core concepts
├── integrations/ # Integration documentation
│ ├── ai/ # AI integrations
│ ├── caching/ # Caching integrations
│ ├── cloud/ # Cloud integrations
│ ├── compute/ # Compute integrations
│ ├── databases/ # Database integrations
│ ├── frameworks/ # Framework integrations
│ ├── messaging/ # Messaging integrations
│ ├── observability/ # Observability integrations
│ ├── reverse-proxies/ # Reverse proxy integrations
│ └── security/ # Security integrations
├── reference/ # API reference
├── testing/ # Testing guides
└── whats-new/ # Release notes
When calling pnpm dev or aspire run to test documentation in the context of CI/CD, or from an LLM, call astro telemetry disable to disable telemetry.
Every documentation file requires frontmatter:
---
title: Page Title
description: A brief summary of the page content (required for SEO)
---Optional frontmatter fields:
next: false- Disable "Next page" link for terminal pages- Custom metadata as needed by Starlight theme
Import Starlight components at the top of your MDX file:
import { CardGrid, LinkCard, Steps, Tabs, TabItem, Icon, FileTree } from '@astrojs/starlight/components';Additional commonly used imports:
import { Kbd } from 'starlight-kbd/components';
import LearnMore from '@components/LearnMore.astro';
import PivotSelector from '@components/PivotSelector.astro';
import Pivot from '@components/Pivot.astro';
import ThemeImage from '@components/ThemeImage.astro';
import InstallPackage from '@components/InstallPackage.astro';
import InstallDotNetPackage from '@components/InstallDotNetPackage.astro';
import AsciinemaPlayer from '@components/AsciinemaPlayer.astro';
import Badge from '@astrojs/starlight/components/Badge.astro';
import Image from 'astro:assets';Prefer existing components in src/frontend/src/components/ over bespoke MDX markup when the site already has a reusable pattern for the content. This keeps docs consistent and reduces duplicated styling, accessibility fixes, and behavior logic.
When you introduce or change a custom component that is used by docs pages:
- Keep the public props intentional and typed so MDX authors get statement completion and editor help.
- Reuse existing aliases such as
@components/*and@assets/*rather than deep relative imports. - Prefer moving heavier shared logic into colocated
.tshelpers when the.astrofrontmatter becomes large or is duplicated across components. - Treat user-visible behavior, accessibility, and responsive behavior as part of the documentation contract, not as optional polish.
Prefer fenced ::: callouts for tips, notes, cautions, and warnings. Use the Aside component only when a JSX-only composition pattern is required.
:::tip[Pro Tip]
This is a helpful tip for users.
:::
:::note
Important information users should be aware of.
:::
:::caution
Proceed with care - this may have unexpected consequences.
:::
:::danger
Critical warning - this could cause data loss or security issues.
:::Use for sequential instructions:
<Steps>
1. First step with explanation
```bash title="Run this command"
aspire new aspire-starter
```
2. Second step
3. Third step
</Steps>Use for language or platform-specific content:
<Tabs syncKey="cli-commands">
<TabItem label="CLI">
```bash
aspire runPress F5 to start debugging.
```If a heading should appear in the On this page table of contents, keep that heading outside the Tabs component. Headings placed inside TabItem content may be skipped by the generated TOC.
Use for programming language selection that persists across page:
<PivotSelector
title="Select your programming language"
key="lang"
options={[
{ id: "csharp", title: "C#" },
{ id: "python", title: "Python" },
]}
/>
<Pivot id="csharp">
C# specific content here.
</Pivot>
<Pivot id="python">
Python specific content here.
</Pivot>If a heading needs to appear in the On this page table of contents, keep the heading outside the Pivot content and put only the variant-specific body content inside each Pivot.
For Aspire AppHost docs, use a single page-level PivotSelector with key="aspire-lang" when the surrounding section flow should switch as one unit. If a page would otherwise need multiple aspire-lang selectors, keep the page-level selector for the main flow and use synced Tabs/TabItem with syncKey='aspire-lang' for repeated language-specific examples later on the page.
<Tabs syncKey='aspire-lang'>
<TabItem id='csharp' label='C#'>
C# example content here.
</TabItem>
<TabItem id='typescript' label='TypeScript'>
TypeScript example content here.
</TabItem>
</Tabs>Use for navigation and feature highlights:
<CardGrid>
<LinkCard
title="Getting Started"
description="Build your first Aspire app"
href="/get-started/first-app/"
/>
<LinkCard
title="Integrations"
description="Explore available integrations"
href="/integrations/"
/>
</CardGrid>Use the Kbd component from starlight-kbd to display keyboard shortcuts with OS-specific variants. This renders styled <kbd> elements and automatically shows the correct shortcut for the reader's operating system.
import { Kbd } from 'starlight-kbd/components';
Open the Command Palette (<Kbd windows="Ctrl+Shift+P" mac="Cmd+Shift+P" />)Props:
windows— The shortcut for Windows (also used as the default/Linux fallback)mac— The shortcut for macOSlinux— (optional) The shortcut for Linux, if different from Windows
You can specify just windows when the shortcut is the same on all platforms (e.g., <Kbd windows="F5" />), or provide OS-specific values when they differ:
Open a terminal (<Kbd windows="Ctrl+`" mac="⌘+`" linux="Ctrl+`" />)Always prefer the Kbd component over the raw HTML <kbd> element, even for simple keys that don't vary by OS. This ensures consistent styling and behavior across the site:
Press <Kbd windows="F5" /> to start debugging.Use the LearnMore component to add a styled "learn more" link with an open-book icon. It provides a consistent visual pattern for directing readers to related documentation.
import LearnMore from '@components/LearnMore.astro';
<LearnMore>
For more information, see [Service Defaults](/fundamentals/service-defaults/).
</LearnMore>The component renders an open-book icon alongside the provided content. Place it after a section or code example to point readers to deeper documentation. It works well inside fenced ::: callouts or after <Steps>:
:::tip[Feature flag]
Enable polyglot support by running:
```bash
aspire config set features:polyglotSupportEnabled true --global
```
<LearnMore>
For more information, see [aspire config command reference](/reference/cli/commands/aspire-config-set/)
</LearnMore>
:::Use Aspire's custom components when they express a documentation pattern more clearly than raw Markdown or ad hoc HTML. Common examples include LearnMore, PivotSelector, Pivot, ThemeImage, InstallPackage, InstallDotNetPackage, AsciinemaPlayer, and the other components in src/frontend/src/components/.
Before introducing a new custom component for docs:
- Check whether an existing component already solves the layout or interaction.
- Prefer extending an existing component when the semantics stay clear.
- Only add a new component when the pattern will be reused or the behavior is complex enough to justify a shared abstraction.
If you add or change a custom component, also update the relevant tests so documentation behavior stays covered.
Always include a descriptive title:
```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var api = builder.AddProject<Projects.Api>("api");
// After adding all resources, run the app...
builder.Build().Run();
``````typescript title="apphost.ts"
import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const api = await builder.addProject("api", "../Api/Api.csproj");
await builder.build().run();
```For JSON configuration:
```json title="JSON — appsettings.json"
{
"ConnectionStrings": {
"mydb": "Host=localhost;Database=mydb"
}
}
```For hosting packages:
<InstallPackage package="Aspire.Hosting.Redis" />For client/library packages:
<InstallDotNetPackage package="Aspire.StackExchange.Redis" />Aspire supports both C# AppHosts (AppHost.cs) and TypeScript AppHosts (apphost.ts). Documentation must treat both languages as first-class citizens. Never write AppHost or hosting-integration documentation with a C#-only bias.
- Always show both languages: Every AppHost-focused example or walkthrough must include both C# and TypeScript variants unless the feature is genuinely language-specific.
- Use neutral framing: Write prose that applies to both languages. Say "In your AppHost" not "In your C# project". Say "Add a Redis resource" not "Call
builder.AddRedis()". - Neither language is the default: Don't present C# first as the "real" example and TypeScript as an afterthought. Both tabs are equal peers.
- Verify TypeScript APIs exist: Before writing a TypeScript example, confirm the API exists in the TypeScript AppHost SDK. Do not invent TypeScript samples — if you are unsure whether an API is available, flag it for review.
Use AppHostLangPivot for AppHost-specific content that changes between C# and TypeScript. The component is controlled by the site-wide AppHost selector in the sidebar, so it should be the default choice for AppHost walkthroughs, code samples, and prose that should switch together.
import AppHostLangPivot from '@components/AppHostLangPivot.astro';
<AppHostLangPivot>
<div slot="csharp">
```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
builder.AddProject<Projects.Api>("api")
.WithReference(cache);
builder.Build().Run();
```
</div>
<div slot="typescript">
```typescript title="apphost.ts"
import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const cache = await builder.addRedis("cache");
const api = await builder.addProject("api", "../Api/Api.csproj");
await api.withReference(cache);
await builder.build().run();
```
</div>
</AppHostLangPivot>Use AppHostLangPivot for more than code blocks when needed. Entire paragraphs, lists, asides, or multi-step sections can live inside the csharp and typescript slots when the workflows differ. The pivot itself is the shared wrapper; the slot names are the language discriminator.
Use Tabs for other concerns such as CLI vs IDE, deployment targets, or platform choices. Do not use Tabs syncKey="apphost-lang" for new AppHost content.
If a section heading should appear in the On this page table of contents, keep that heading outside AppHostLangPivot. Headings inside the csharp and typescript slots can be missed by the TOC generator, so the recommended pattern is a shared heading followed by an AppHostLangPivot containing only the language-specific body content.
| Aspect | C# | TypeScript |
|---|---|---|
| File title | title="AppHost.cs" |
title="apphost.ts" |
| Pivot wrapper | Shared AppHostLangPivot container |
Shared AppHostLangPivot container |
| Language slot | slot="csharp" |
slot="typescript" |
| Builder creation | DistributedApplication.CreateBuilder(args) |
import { createBuilder } from './.modules/aspire.js'; 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() |
When writing narrative text around AppHost examples:
- ✅ "Add a Redis resource to your AppHost"
- ✅ "The following example shows how to configure a PostgreSQL resource"
- ❌ "Call
builder.AddRedis()in your Program.cs" (C#-specific) - ❌ "Add the following C# code to your AppHost" (when both languages should be shown)
When a concept differs between languages (e.g., configuration files, async patterns), explain both within the AppHostLangPivot slots or in language-neutral prose above the pivot.
If a hosting integration does not yet have TypeScript AppHost support, show only the C# example without AppHostLangPivot and add a note:
<Aside type="note">
TypeScript AppHost support for this integration is not yet available.
</Aside>Do not wrap a single language in AppHostLangPivot or a single-language <Tabs> component — that creates a misleading UI suggesting another option exists.
Place integration docs in the appropriate category folder under src/frontend/src/content/docs/integrations/:
| Category | Folder | Examples |
|---|---|---|
| AI/ML | ai/ |
Ollama, Azure OpenAI |
| Caching | caching/ |
Redis, Garnet, Valkey |
| Cloud | cloud/ |
Azure, AWS services |
| Compute | compute/ |
Docker, Kubernetes |
| Databases | databases/ |
PostgreSQL, SQL Server, MongoDB |
| Frameworks | frameworks/ |
Python, Rust, Orleans |
| Messaging | messaging/ |
RabbitMQ, Kafka |
| Observability | observability/ |
OpenTelemetry, Prometheus |
| Reverse Proxies | reverse-proxies/ |
YARP |
| Security | security/ |
Keycloak |
---
title: [Technology] integration
description: Learn how to use the [Technology] integration with Aspire.
---
import { Aside } from '@astrojs/starlight/components';
import AppHostLangPivot from '@components/AppHostLangPivot.astro';
import InstallPackage from '@components/InstallPackage.astro';
import Image from 'astro:assets';
import techIcon from "@assets/icons/technology.svg";
<Image src={techIcon} alt="Technology logo" width={100} height={100} style="float: left; margin-right: 1rem;" data-zoom-off />
Brief description of the technology and what the integration enables.
## Hosting integration
<InstallPackage package="Aspire.Hosting.Technology" />
### Add [Technology] resource
<AppHostLangPivot>
<div slot="csharp">
```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var tech = builder.AddTechnology("tech");
// After adding all resources, run the app...
builder.Build().Run();
```
</div>
<div slot="typescript">
```typescript title="apphost.ts"
import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const tech = await builder.addTechnology("tech");
await builder.build().run();
```
</div>
</AppHostLangPivot>
### Configuration options
Describe available configuration methods and options.
## See also
- [Official Technology documentation](https://...)
- [Related Aspire documentation](/path/to/related/)Include both hosting and client sections:
## Hosting integration
<InstallPackage package="Aspire.Hosting.Technology" />
### Add [Technology] resource
<AppHostLangPivot>
<div slot="csharp">
```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);
var tech = builder.AddTechnology("tech");
builder.AddProject<Projects.Api>("api")
.WithReference(tech);
builder.Build().Run();
```
</div>
<div slot="typescript">
```typescript title="apphost.ts"
import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const tech = await builder.addTechnology("tech");
const api = await builder.addProject("api", "../Api/Api.csproj");
await api.withReference(tech);
await builder.build().run();
```
</div>
</AppHostLangPivot>
### Hosting integration health checks
[Health check information if applicable...]
## Client integration
<InstallDotNetPackage package="Aspire.Technology" />
### Add [Technology] client
```csharp title="C# — Program.cs"
builder.AddTechnologyClient("tech");
```
### Add keyed [Technology] client
```csharp title="C# — Program.cs"
builder.AddKeyedTechnologyClient("tech");
```
For more information, see [.NET dependency injection: Keyed services](https://learn.microsoft.com/dotnet/core/extensions/dependency-injection#keyed-services).
### Configuration
#### Connection strings
The connection name must match the resource name defined in the AppHost.
#### Configuration providers
```json title="JSON — appsettings.json"
{
"Aspire": {
"Technology": {
"myconnection": {
"Option1": "value"
}
}
}
}
```
### Client integration health checks
[Health check information...]
### Observability and telemetry
[Logging and tracing information...]
## See also
- [Official documentation](https://...)For integrations from the Aspire Community Toolkit, add the badge at the top:
import Badge from '@astrojs/starlight/components/Badge.astro';
<Badge text="⭐ Community Toolkit" variant="tip" size="large" />After creating documentation, update the sidebar configuration:
Edit src/frontend/config/sidebar/sidebar.topics.ts (or the appropriate topic file)
Add entries to the appropriate section in alphabetical order:
{ label: "Technology Name", slug: "integrations/category/technology" }For collapsed sections with children:
{
label: "Technology Name",
collapsed: true,
items: [
{ label: "Overview", slug: "integrations/category/technology" },
{ label: "Advanced", slug: "integrations/category/technology-advanced" },
]
}After adding integration documentation, run the update-integrations prompt to ensure the integration is indexed:
.github/prompts/update-integrations.prompt.md
- Use second person ("you") when addressing the reader
- Use active voice ("Create a resource" not "A resource is created")
- Use imperative mood for instructions ("Call the method" not "You should call the method")
- Be concise but complete
- Be professional but approachable
Use consistent terminology throughout:
| Preferred | Avoid |
|---|---|
| Aspire | .NET Aspire (except in formal/legal contexts) |
| AppHost | App Host, app host |
| resource | component (for AppHost resources) |
| integration | connector, plugin |
- Use inclusive, accessible language
- Avoid assumptions about the reader's background
- Use gender-neutral pronouns (they/them) or rewrite to avoid pronouns
- Avoid ableist language (e.g., "blind to", "crippled by")
- Use people-first language when discussing disabilities
- Do not frame
.NETas the default and everything else as an exception. Avoid phrases such asnon-.NET,other languages, or wording that treats Python, JavaScript, Go, or container-based apps as secondary scenarios. - When a section is really about a capability or execution model, name that directly instead of contrasting it with
.NET. For example, prefer headings such asPass connection information to app resourcesorRun applications directly on the hostover.NETvs.non-.NETframing. - If specific runtimes matter, name them because the product behavior differs for them—not just as a find-and-replace for
non-.NET. Otherwise, use positive, capability-based language such asmulti-language apps,app resources,services built from Dockerfiles, orapps that consume environment variables directly.
- Write dates as "January 15, 2025" not "1/15/25"
- Specify time zones when referencing specific times
- Use diverse, international examples
- Avoid idioms and culturally-specific references
Place icons in src/frontend/src/assets/icons/
import Image from 'astro:assets';
import techIcon from "@assets/icons/technology.svg";
<Image
src={techIcon}
alt="Technology logo"
width={100}
height={100}
style="float: left; margin-right: 1rem;"
data-zoom-off
/>For light/dark theme variants:
import ThemeImage from '@components/ThemeImage.astro';
<ThemeImage
lightSrc={techIconLight}
darkSrc={techIconDark}
alt="Technology logo"
width={100}
height={100}
/>For details on terminal recordings, including how to create and embed them, see the terminal-recordings skill reference.
Before submitting documentation:
- Preview locally: Run the site locally to verify rendering and content flow
- Check links: Ensure all internal and external links work
- Validate code: Test all code examples compile and run using
aspire run - Review formatting: Verify components render correctly
- Run relevant tests: Do not consider documentation or component work done until the affected tests pass
- Check navigation: Confirm sidebar entries are correct
Use the smallest set of checks that proves the change is correct:
- For MDX copy, structure, and navigation changes, verify the page locally and check the edited links.
- For custom component usage changes, run the component render tests that cover the affected behavior.
- For component prop surface changes, update and run the prop-contract coverage so editor completions and consumer typings stay intact.
- For interactive behavior changes, run targeted Playwright coverage for the scenario you changed rather than relying on unrelated broad suites.
- For accessibility-sensitive changes, validate both the rendered page and any focused accessibility tests that exercise the affected interaction.
If a documentation change adds, removes, or materially changes a custom component, you should usually update one or more of these test layers:
src/frontend/tests/unit/custom-components.vitest.test.tsfor runtime render coverage of custom Astro components.src/frontend/tests/typecheck/component-props.contracts.tswhen component props change and the public prop contract should remain typed for MDX and other consumers.src/frontend/tests/e2e/*.spec.tsfor user-visible interactions that depend on hydration, persistence, navigation, or accessibility behavior.
Examples of scenarios that often merit targeted tests:
- query-string or local-storage persistence
- cookie-consent or preference-driven behavior
- responsive behavior that changes across desktop, tablet, and mobile
- keyboard navigation, focus management, or screen-reader labeling
- repeated code examples that need distinct accessible labels or titles
- RSS, analytics, or other generated/static asset behaviors exposed through docs pages
Prefer targeted validation over the slowest possible full-site build when the change does not require it.
pnpm --dir ./src/frontend run test:unit:components
pnpm --dir ./src/frontend run test:unit:contracts
pnpm --dir ./src/frontend exec playwright test tests/e2e/<relevant-spec>.tsIf you changed custom components, docs interactions, or accessibility behavior, make sure the relevant targeted tests pass before submitting the work.
Ensure you have the appropriate version of the Aspire CLI installed for testing. The version depends on what you're documenting:
For documenting released features:
# Linux/macOS
curl -sSL https://aspire.dev/install.sh | bash
# Windows (PowerShell)
irm https://aspire.dev/install.ps1 | iexFor complete installation instructions, see Install Aspire CLI.
For documenting features on the main branch that haven't been released yet:
# Linux/macOS
curl -sSL https://aspire.dev/install.sh | bash -s -- --quality dev
# Windows (PowerShell)
iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'dev'"You can also access this via the download icon on aspire.dev and selecting "Dev" from the Channel selector.
For documenting features in specific pull requests before they merge:
- Go to the PR in microsoft/aspire
- Find the build artifacts in the Checks/Actions section
- Download and install the CLI from the PR artifacts
This is useful for getting an early start on documentation for upcoming features.
For prerelease builds from the current release branch:
# Linux/macOS
curl -sSL https://aspire.dev/install.sh | bash -s -- --quality staging
# Windows (PowerShell)
iex "& { $(irm https://aspire.dev/install.ps1) } -Quality 'staging'"The documentation site can be run locally using the Aspire CLI:
aspire runUse the Aspire MCP tools to check the status of resources:
mcp_aspire_list_resources
Navigate to the frontend resource endpoint to view the documentation site.
Use standard Markdown links with absolute paths from the docs root:
For more information, see [Service Defaults](/fundamentals/service-defaults/).Use the 📦 emoji with links:
Install the [📦 Aspire.Hosting.Redis](https://nuget.org/packages/Aspire.Hosting.Redis) package.End pages with a "See also" section linking to:
- Official technology documentation
- Related Aspire documentation
- NuGet package pages
- GitHub repositories (when applicable)
The aspire.dev site supports multiple languages. When creating new content:
- Create content in the default (English) location first
- Localized versions are managed separately in their respective folders (e.g.,
fr/,de/,ja/) - Do not manually translate content - follow the project's localization workflow
<Aside type="note" title="Prerequisites">
Before continuing, ensure you have:
- [Installed the Aspire CLI](/get-started/install-cli/)
- [Completed the prerequisites](/get-started/prerequisites/)
</Aside><Aside type="caution">
This feature requires Aspire version 9.0 or later.
</Aside><Aside type="danger" title="Experimental">
This feature is experimental and may change in future releases.
</Aside>The site supports Mermaid diagrams for architecture visualization:
```mermaid
architecture-beta
service api(logos:dotnet)[API service]
service frontend(aspire:blazor)[Blazor front end]
frontend:L --> R:api
```Use the architecture-beta diagram type for service architecture diagrams.
The following rules are derived from common feedback patterns in documentation PRs. Following these rules will help avoid common mistakes.
- Remove unnecessary commas: Don't write "Now, that you have..." - write "Now that you have..."
- Avoid casual language: Don't include phrases like "treat yourself to a coffee" or other informal asides in documentation
- Remove unused imports: Don't import components that aren't used in the document
- Verify all internal links: Links must point to pages that actually exist. Common mistakes:
- Linking to
/get-started/setup-and-tooling/instead of/get-started/prerequisites/ - Linking to
/reference/cli/for CLI installation instead of/get-started/install-cli/
- Linking to
- Add redirects when restructuring: When moving or renaming documentation pages, add redirect entries in
src/frontend/config/redirects.mjs
-
Use standard indentation: For fluent APIs on newlines, use standard 4-space indentation, NOT alignment with the method call above
✅ Correct:
builder.AddProject<Projects.Api>("api") .WithReference(redis) .WithExternalHttpEndpoints();
❌ Incorrect (aligned indentation):
builder.AddProject<Projects.Api>("api") .WithReference(redis) .WithExternalHttpEndpoints();
-
Code block language identifiers: Use only one language identifier, not duplicates like
csharp csharp -
Verify code syntax: Check for typos in code:
main:appnotmain.app(Python uvicorn module:app format)- Verify package/module names are correct
-
Accurate technical descriptions:
process.envis an object, not a methodexpressis NOT used to access environment variables (that'sprocess.env)- Don't claim libraries do things they don't do
-
Connection string environment variables:
- For C#/.NET: Use
ConnectionStrings:resourcename(colon separator) - For Python/JavaScript: Use
ConnectionStrings__resourcename(double underscore separator) - Use the standard
ConnectionStrings__<resourcename>pattern, not custom variable names likeELASTICSEARCH_ENDPOINT
- For C#/.NET: Use
-
Don't document deprecated APIs as primary examples: If an API is deprecated, don't use it as the first or main example. Use current, recommended APIs.
-
Avoid insecure defaults in examples: Don't include
TrustServerCertificate=truein connection strings without noting it's for development only
-
Match Pivot components to their PivotSelector: When using nested Pivot components, ensure they reference the correct parent PivotSelector with the
keyattribute -
Keep LinkCard descriptions concise: Card descriptions should be short enough to not squeeze the UI. Prefer "Configure persistence..." over "Discover how to configure persistence..."
-
Avoid redundant Asides: Don't have two Asides saying similar things near each other
When documenting integrations that support multiple languages (C#, Python, JavaScript):
- Show complete, working examples for each language
- Ensure variable names are defined before they're used in code examples
- Verify the same resource name is used consistently across language examples
- Don't remove code that defines variables that are used later in the document