Official agent skill

Doc Writer

by microsoft in microsoft/aspire.dev

Guidelines for producing accurate and maintainable documentation for the Aspire documentation site.

OfficialMITAuto-check passedFrontend & Design

Install Doc Writer

skills CLI
$ npx skills add microsoft/aspire.dev --skill doc-writer -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install microsoft/aspire.dev doc-writer --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/microsoft/aspire.dev.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/doc-writer .claude/skills/doc-writer && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
doc-writer
GitHub stars
196
Token cost
~7.6k tokens
SKILL.md length
2,058 words
Files
7 (incl. references)
Skills in repo
8
Repo updated
First seen
Licence
MIT

At a glance

Guidelines for producing accurate and maintainable documentation for the Aspire documentation site.

  • Works in 5 steps: Always show both languages: Every… → Show implementations, not availability… → Use neutral framing: Write prose that… → …
  • Updating user guides
  • SKILL.md covers Documentation Overview, Astro and MDX Conventions, AppHost Language Parity… and Updating Navigation, plus 2 more sections
  • Calls pnpm and az

What it does

Doc Writer is an agent skill from microsoft/aspire.dev, published by the product's own GitHub organization. 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.

Its SKILL.md is about 7.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including reference files (for example `references/common-documentation-issues.md`, `references/cross-referencing.md` and `references/integration-documentation.md`).

It sits in Frontend & Design, covering Static sites and blogs and Technical writing. It works with Astro. The repository describes itself as: The official website for all things aspire.dev. The licence is MIT.

When your agent uses it

  • Updating user guides
  • Integration docs
  • Custom components used by docs
  • Documentation-related tests and validation on aspire.dev

Example prompts

  • “Use the doc-writer skill to guideline for producing accurate and maintainable documentation for the Aspire documentation site”
  • “/doc-writer”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Always show both languages: Every AppHost-focused example, walkthrough, and AppHost code sample must include both TypeScript and C#…
  2. Show implementations, not availability notes: When a TypeScript AppHost API exists, demonstrate it in a complete TypeScript tab beside the…
  3. Use neutral framing: Write prose that applies to both languages. Say "In your AppHost" not "In your C# project". Say "Add a Redis…
  4. Default to TypeScript: Put the TypeScript tab first so apphost.mts is on the left and selected for readers without a saved preference…
  5. Verify TypeScript APIs exist: Before writing a TypeScript example, confirm the API exists in the TypeScript AppHost SDK. Do not invent…

What it can do on your machine

Read from SKILL.md and the folder at commit 6f96d23. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm
    • az

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm and az, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Doc Writer loads about 7.6k tokens when it runs, and up to ~16k if it reads all its reference files. Until then it costs about 69 tokens; SKILL.md has 2,058 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~69
When it runs · the whole SKILL.md, loaded when a task matches
~7.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~16k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from microsoft/aspire.dev at commit 6f96d23, republished under its MIT licence (© microsoft). 2,058 words, ~7,634 tokens.

Download SKILL.mdSave it as .claude/skills/doc-writer/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
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.

Documentation Writer Skill

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.

When drafting or editing any document, follow the rules in the Common Documentation Issues reference.

When linking or referring to any other resource, follow the rules in the Cross-Referencing reference.

When drafting or editing documentation for an Aspire integration, use the file locations and documentation structures in the Integration Documentation reference.

Before finishing any draft, check it against the Prose Patterns skill reference.

Before finishing any draft, test it as described in the Testing Your Documentation reference.

Documentation Overview

Site Structure

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)

Documentation Categories
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
Localization and Sidebar Labels

When adding, moving, or renaming localized docs pages, keep the sidebar topic config in sync under src/frontend/config/sidebar/*.topics.ts. Topic labels and item translations should include entries for the supported Starlight locale codes used by the site, such as pt-BR and zh-CN; do not add obsolete or generic locale keys like pt or pt-PT unless they are explicitly present in src/frontend/config/locales.ts.

Route path segments can be lowercase (pt-br, zh-cn), but sidebar translation keys follow the locale codes consumed by Starlight. API reference docs under src/content/docs/reference/api/ are intentionally not localized and should stay excluded from localization/sidebar translation work.

Astro and MDX Conventions

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.

Frontmatter

Every documentation file requires frontmatter:

yaml
---
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
  • 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:

FieldComposed length targetHard limit
title41-51 characters70 characters
seoTitle50-60 characters70 characters
description110-160 characters200 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, or custom components as needed:

tsx
import {
  CardGrid,
  LinkCard,
  Steps,
  Tabs,
  TabItem,
  Icon,
} from "@astrojs/starlight/components";
import FileTree from "starlight-plugin-icons/components/FileTree.astro";

Additional commonly used imports:

tsx
import { Kbd } from "starlight-kbd/components";
import LearnMore from "@components/LearnMore.astro";
import OsAwareTabs from "@components/OsAwareTabs.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";
Component Usage

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 .ts helpers when the .astro frontmatter 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.
Common Markdown syntax

Use the rendered examples in src/frontend/src/content/docs/community/contributor-guide.mdx as the canonical reference for common Markdown syntax. When adding tables, use padded pipes, a separator row with at least three hyphens per cell, and blank lines before and after the table:

md
| Feature | Description | Status |
| ------- | ----------- | ------ |
| Dashboard | Web-based monitoring | Available |

Do not replace standard Markdown with ad hoc HTML unless a component or layout requirement cannot be expressed clearly in Markdown.

Aside (Callouts)

Prefer fenced ::: callouts for tips, notes, cautions, and warnings. Use the Aside component only when a JSX-only composition pattern is required.

mdx
:::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.
:::
Steps

Use for sequential instructions:

mdx
<Steps>

1. First step with explanation

   ```bash title="Run this command"
   aspire new aspire-starter
   ```

2. Second step

3. Third step

</Steps>
Tabs/TabItem

Use for language or platform-specific content:

mdx
<Tabs syncKey="cli-commands">
<TabItem label="CLI">

```bash
aspire run
```
</TabItem>
<TabItem label="Visual Studio">

Press F5 to start debugging.

</TabItem>
</Tabs>
```

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.

OsAwareTabs (Bash and PowerShell)

When the only tab options are Bash and PowerShell, always use the OsAwareTabs custom component instead of bare <Tabs> / <TabItem>. OsAwareTabs wraps Starlight's synced Tabs and adds OS-aware behavior:

  • Detects the reader's operating system and defaults the active tab to PowerShell on Windows and Bash everywhere else.
  • Uses the canonical seti:shell and seti:powershell icons so the labels render consistently across the site.
  • Persists the reader's choice across pages via the standard Starlight syncKey. Use syncKey="terminal" so all OS-aware terminal blocks stay in sync.
  • Exposes two named slots — unix and windows — that contain the Bash and PowerShell content respectively.
mdx
import OsAwareTabs from "@components/OsAwareTabs.astro";

<OsAwareTabs syncKey="terminal">
<div slot="unix">

```bash
az group create --name my-group --location westus3
```

</div>
<div slot="windows">

```powershell
az group create --name my-group --location westus3
```

</div>
</OsAwareTabs>

A few rules to follow:

  • Do not wrap a Bash + PowerShell pairing in bare <Tabs syncKey="shell-lang"> — convert it to OsAwareTabs instead. This is the canonical pattern used across the dashboard, install-cli, container-networking, and AKS deployment guides.
  • Always set syncKey="terminal" unless there is a specific reason to scope the persistence differently. The site-wide convention is a single shared key so a reader who picks PowerShell once continues to see PowerShell on every page that offers the choice.
  • Keep the leading and trailing blank lines around the inner code fences (as shown above). MDX requires the blank lines so the fenced code block is parsed correctly inside the slotted <div>.
  • OsAwareTabs is only for the Bash + PowerShell pairing. Continue to use bare <Tabs> / <TabItem> for non-OS choices such as C#/TypeScript AppHost samples (syncKey='aspire-lang'), CLI vs IDE, deployment targets, or package managers.
Pivot/PivotSelector

Use Pivot and PivotSelector sparingly, only for key landing-page-style articles where the choice should persist across page navigations and where sharing the page through a URL should land the reader on a specific variant. Pivots support query string values to set the selected option (for example, ?aspire-lang=typescript). Examples in use today include the Build your first Aspire app and Deploy your first Aspire app tutorials.

For most pages — including AppHost C# and TypeScript code samples within a guide — prefer synced Tabs / TabItem blocks at the snippet level instead. See AppHost Language Parity (C# and TypeScript).

mdx
<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.

On this page and "Overview" headings

When a page shows the On this page table of contents (the default behavior unless tableOfContents: false is set), do not add an Overview heading at any level (##, ###, etc.). The docs site already provides an implicit overview link to the top of the page, so an explicit Overview heading becomes redundant.

If your opening section is truly introductory, keep it as body copy without an Overview heading. If that section has a more specific purpose, use a descriptive heading such as Key concepts, Prerequisites, or another topic-specific label.

For Aspire AppHost code examples, use synced Tabs / TabItem blocks with syncKey='aspire-lang' at each code snippet. List TypeScript first so apphost.mts is the default experience for readers without a saved preference. Do not add a page-level PivotSelector just to switch AppHost code samples between TypeScript and C#. Readers should be able to switch the language at the specific snippet they are reading.

mdx
<Tabs syncKey='aspire-lang'>
<TabItem id='typescript' label='TypeScript'>
TypeScript example content here.
</TabItem>

<TabItem id='csharp' label='C#'>
C# example content here.
</TabItem>
</Tabs>
CardGrid and LinkCard

Use for navigation and feature highlights:

mdx
<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>
Kbd (Keyboard Shortcuts)

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.

mdx
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 macOS
  • linux — (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:

mdx
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:

mdx
Press <Kbd windows="F5" /> to start debugging.
LearnMore

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.

mdx
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>:

mdx
:::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>
:::
Aspire Custom Components

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.

Code Blocks

Always include a descriptive title:

mdx
```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();
```
mdx
```typescript title="apphost.mts"
import { createBuilder } from "./.aspire/modules/aspire.mjs";

const builder = await createBuilder();

const api = await builder.addProject("api", "../Api/Api.csproj");

await builder.build().run();
```

For JSON configuration:

mdx
```json title="JSON — appsettings.json"
{
  "ConnectionStrings": {
    "mydb": "Host=localhost;Database=mydb"
  }
}
```
Package Installation Components

For hosting packages:

mdx
<InstallPackage package="Aspire.Hosting.Redis" />

For client/library packages:

mdx
<InstallDotNetPackage package="Aspire.StackExchange.Redis" />

AppHost Language Parity (TypeScript and C#)

Aspire supports both TypeScript AppHosts (apphost.mts) and C# AppHosts (AppHost.cs). Documentation must treat both languages as first-class citizens. Always show both TypeScript and C# 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.

Show full SKILL.md (1,137 more words)Show less
Core Principles
  1. Always show both languages: Every AppHost-focused example, walkthrough, and AppHost code sample must include both TypeScript and C# variants unless the feature is genuinely language-specific.
  2. Show implementations, not availability notes: When a TypeScript AppHost API exists, demonstrate it in a complete TypeScript tab beside the C# example. A note or callout that only names the available TypeScript methods does not satisfy language parity.
  3. 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()".
  4. Default to TypeScript: Put the TypeScript tab first so apphost.mts is on the left and selected for readers without a saved preference. Keep C# as an equal peer and preserve the reader's explicit language selection.
  5. 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.
AppHost tabs pattern for AppHost content

Use synced Tabs for AppHost-specific content that changes between TypeScript and C#. Each AppHost code snippet should provide its own language tabs, list TypeScript first, and use syncKey='aspire-lang' so the user's language choice stays synchronized across snippets on the page.

mdx
import { Tabs, TabItem } from "@astrojs/starlight/components";

<Tabs syncKey='aspire-lang'>
<TabItem id='typescript' label='TypeScript'>

```typescript title="apphost.mts"
import { createBuilder } from "./.aspire/modules/aspire.mjs";

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();
```

</TabItem>
<TabItem id='csharp' label='C#'>

```csharp title="AppHost.cs"
var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

builder.AddProject<Projects.Api>("api")
    .WithReference(cache);

builder.Build().Run();
```

</TabItem>
</Tabs>

Use the same synced tabs pattern for more than code blocks when needed. Entire paragraphs, lists, asides, or multi-step sections can live inside the csharp and typescript tab items when the workflows differ.

Use different syncKey values for other concerns such as CLI vs IDE, deployment targets, platform choices, or package managers. For AppHost language tabs, use exactly syncKey='aspire-lang'.

If a section heading should appear in the On this page table of contents, keep that heading outside Tabs. Headings inside TabItem content may be skipped by the TOC generator, so the recommended pattern is a shared heading followed by tabs containing only the language-specific body content.

Conventions
AspectTypeScriptC#
File titletitle="apphost.mts"title="AppHost.cs"
Tab wrapperShared <Tabs syncKey='aspire-lang'> containerShared <Tabs syncKey='aspire-lang'> container
Tab item<TabItem id='typescript' label='TypeScript'><TabItem id='csharp' label='C#'>
Builder creationimport { createBuilder } from './.aspire/modules/aspire.mjs'; then newline for space followed by await createBuilder();DistributedApplication.CreateBuilder(args)
Method casingcamelCase (addRedis)PascalCase (AddRedis)
Async patternawait each builder callSynchronous fluent calls
Build & runawait builder.build().run()builder.Build().Run()
Prose Guidelines

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 AppHost language tabs or in language-neutral prose above the tabs.

When TypeScript Is Not Yet Supported

If a hosting integration does not yet have TypeScript AppHost support, show only the C# example without language tabs and add a note:

mdx
<Aside type="note">
  TypeScript AppHost support for this integration is not yet available.
</Aside>

Do not wrap a single language in a single-language <Tabs> component — that creates a misleading UI suggesting another option exists.

Use this exception at the operation level, not as a shortcut for the whole page. If some APIs are exported to TypeScript and others are not, provide synchronized C# and TypeScript tabs for every supported operation and place the limitation beside only the unsupported operation.

Updating Navigation

After creating documentation, update the sidebar configuration:

Location

Edit src/frontend/config/sidebar/sidebar.topics.ts (or the appropriate topic file)

Adding Entries

Add entries to the appropriate section in alphabetical order:

typescript
{ label: "Technology Name", slug: "integrations/category/technology" }

For collapsed sections with children:

typescript
{
  label: "Technology Name",
  collapsed: true,
  items: [
    { label: "Overview", slug: "integrations/category/technology" },
    { label: "Advanced", slug: "integrations/category/technology-advanced" },
  ]
}

After adding or moving integration documentation:

  1. Run pnpm --dir ./src/frontend update:integrations when the package catalog needs to be refreshed from NuGet.
  2. Reconcile the exact package IDs and canonical documentation URLs in src/frontend/src/data/integration-docs.json.
  3. Run pnpm --dir ./src/frontend test:unit:structured-data to verify that the mappings are unique and resolve to real pages.

Writing Style Guidelines

Voice and Tone
  • 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
Terminology

Use consistent terminology throughout:

PreferredAvoid
Aspire.NET Aspire (except in formal/legal contexts)
AppHostApp Host, app host
resourcecomponent (for AppHost resources)
integrationconnector, plugin
Inclusive Language
  • 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 .NET as the default and everything else as an exception. Avoid phrases such as non-.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 as Pass connection information to app resources or Run applications directly on the host over .NET vs. non-.NET framing.
  • 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 as multi-language apps, app resources, services built from Dockerfiles, or apps that consume environment variables directly.
International Considerations
  • 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

Icons and Images

Icon Location

Place icons in src/frontend/src/assets/icons/

Icon Usage
mdx
import { Image } from "astro:assets";
import techIcon from "@assets/icons/technology.svg";

<Image
  src={techIcon}
  alt="Technology logo"
  width={100}
  height={100}
  fit="contain"
  style="float: left; margin-right: 1rem;"
  data-zoom-off
/>

For light/dark theme variants:

mdx
import ThemeImage from "@components/ThemeImage.astro";

<ThemeImage
  light={techIconLight}
  dark={techIconDark}
  alt="Technology logo"
  width={100}
  height={100}
/>

When an integration logo sets both width and height, use fit="contain" so Astro preserves the complete source artwork instead of cropping it to the requested aspect ratio. ThemeImage applies contained fitting automatically. Use ThemeImage whenever separate light and dark logo assets exist.

Terminal Recordings (Asciinema)

For details on terminal recordings, including how to create and embed them, see the terminal-recordings skill reference.

Localization

The aspire.dev site supports multiple languages. When creating new content:

  1. Create content in the default (English) location first
  2. Localized versions are managed separately in their respective folders (e.g., fr/, de/, ja/)
  3. Do not manually translate content - follow the project's localization workflow

Common Patterns

Prerequisites Notes
mdx
<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>
Version-Specific Information

Use the shared build-time placeholders whenever current guidance needs to show the active Aspire release:

PlaceholderUse for
%ASPIRE_VERSION%Full current stable version, including patch
%ASPIRE_VERSION_MAJOR_MINOR%Current major/minor display or installer version

Use these placeholders in package references, Aspire.AppHost.Sdk declarations, file-based app directives, CLI/AppHost output, and generic installation examples that should advance with the release branch. This applies to localized documentation as well as English documentation.

Keep a literal version when the exact version is part of the information being documented, such as a what's-new page, upgrade comparison, minimum-version requirement, compatibility note, historical package pin, or issue reproduction.

mdx
<Aside type="caution">This feature requires Aspire version 9.0 or later.</Aside>
Feature Flags or Experimental Features
mdx
<Aside type="danger" title="Experimental">
  This feature is experimental and may change in future releases.
</Aside>

Mermaid Diagrams

The site supports Mermaid diagrams for architecture visualization:

mdx
```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.

© microsoft, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (references) in .agents/skills/doc-writer of microsoft/aspire.dev.

  • SKILL.md
  • references/common-documentation-issues.md
  • references/cross-referencing.md
  • references/integration-documentation.md
  • references/prose-patterns.md
  • references/terminal-recordings.md
  • references/testing-your-documentation.md

Open the folder on GitHubat commit 6f96d23

Compare with similar skills

Doc Writer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Doc Writer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Doc Writer this skillmicrosoft/aspire.dev196—~7.6kAutomated safety check: PassMIT
Check Docs Stylenrwl/nx29k—~1.3kAutomated safety check: PassMIT
Great Docspymc-labs/pathmc132—~2.7kAutomated safety check: PassMIT
Tabler Astro Dev Servertabler/tabler42k—~1.2kAutomated safety check: PassMIT
Tabler Astro Component Scriptstabler/tabler42k—~2.1kAutomated safety check: PassMIT
Kill AI Slopyetone/kill-ai-slop1.3k—~1.4kAutomated safety check: PassApache-2.0

Similar skills

  • Check modified Nx documentation pages against the astro-docs style guide.

    29k GitHub stars~1.3k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Great Docs

    pymc-labs/pathmc

    Generate documentation sites for Python packages with Great Docs.

    132 GitHub stars~2.7k tokensUpdated 6 days ago
    Frontend & DesignAuto-check passed
  • Starts the right Tabler dev server, keeps it from clashing with builds and verifies changes in the browser before a page or component is handed back.

    42k GitHub stars~1.2k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Rules for adding or fixing client-side scripts in Tabler's Astro components so the copied preview HTML stays readable, self-contained and runs in the right order.

    42k GitHub stars~2.1k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Kill AI Slop

    yetone/kill-ai-slop

    Find and remove AI slop — the generic, machine-default visual and copy tics of vibe-coded products — from a web project.

    1.3k GitHub stars~1.4k tokensUpdated 23 days ago
    Frontend & DesignAuto-check passed
  • Motion Dev Animations

    199-biotechnologies/motion-dev-animations-skill

    Creates 120fps GPU-accelerated animations with Motion.dev (Framer Motion successor) for React, Next.js, Svelte, and Astro projects.

    105 GitHub starsUsed in 1 repo~2.8k tokens
    Frontend & DesignAuto-check: notes

More from microsoft/aspire.dev

All 8 skills in this repo
  • Aspire

    microsoft/aspire.dev

    Official

    Orchestrates Aspire distributed applications using the Aspire CLI for running, debugging, and managing distributed apps.

    196 GitHub starsUsed in 4 repos~1.1k tokens
    Auto-check passed
  • Whatsnew

    microsoft/aspire.dev

    Official

    Step-argument skill that formalizes writing an Aspire "What's new in N.N" release-notes page (src/frontend/src/content/docs/whats-new/aspire-N-N.mdx) as a repeatable lifecycle.

    196 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Container Images

    microsoft/aspire.dev

    Official

    Extracts all container image references (registry, image, tag) from the microsoft/aspire source code and produces a JSON data file for the aspire.dev Astro site.

    196 GitHub stars~2.5k tokensUpdated today
    Auto-check passed
  • Twoslash Validator

    microsoft/aspire.dev

    Official

    Validate and fix two-slash TypeScript examples for aspire.dev.

    196 GitHub stars~856 tokensUpdated today
    Auto-check passed
  • Update Samples

    microsoft/aspire.dev

    Official

    Update the samples data file by fetching sample metadata from the microsoft/aspire-samples GitHub repository.

    196 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Update Integrations

    microsoft/aspire.dev

    Official

    Update integration documentation links and API reference data by synchronizing NuGet package names with their documentation URLs and generating per-package API schemas.

    196 GitHub stars~5.2k tokensUpdated today
    Auto-check passed

Works with

Questions about Doc Writer

What does Doc Writer do?

Guidelines for producing accurate and maintainable documentation for the Aspire documentation site. dev, published by the product's own GitHub organization. Guidelines for producing accurate and maintainable documentation for the Aspire documentation site.

When should I use Doc Writer?

Doc Writer fits situations like: updating user guides; integration docs; custom components used by docs; documentation-related tests and validation on aspire.dev.

How do I install Doc Writer in Claude Code?

Run `npx skills add microsoft/aspire.dev --skill doc-writer -a claude-code`. Or copy the skill folder (.agents/skills/doc-writer in microsoft/aspire.dev) into .claude/skills/doc-writer in your project. Claude Code loads it when a task matches its description.

How do I install Doc Writer in Codex?

Run `npx skills add microsoft/aspire.dev --skill doc-writer -a codex`. Or copy the skill folder (.agents/skills/doc-writer in microsoft/aspire.dev) into .agents/skills/doc-writer in your project. Codex loads it when a task matches its description.

Can I use Doc Writer in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft/aspire.dev --skill doc-writer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/doc-writer, .gemini/skills/doc-writer, .github/skills/doc-writer and .opencode/skills/doc-writer in your project.

What does Doc Writer need to run?

Going by SKILL.md and its folder, Doc Writer needs the command-line tools its instructions call (pnpm and az).

Does Doc Writer access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Doc Writer safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Doc Writer use?

Doc Writer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Doc Writer use?

About 7.6k tokens (SKILL.md is roughly 31k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8.8k tokens, read only when the agent opens those files.

What are the alternatives to Doc Writer?

Skills that share tags, products or a category with Doc Writer: Check Docs Style (nrwl/nx, 29k stars), Great Docs (pymc-labs/pathmc, 132 stars), Tabler Astro Dev Server (tabler/tabler, 42k stars) and Tabler Astro Component Scripts (tabler/tabler, 42k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Doc Writer?

microsoft (a GitHub organization, an official publisher) maintains it in microsoft/aspire.dev, which has 196 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 8, 2026.

Source: microsoft/aspire.dev on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.