Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
microsoft avatar

Aspireify

  • 127 installs
  • 76 repo stars
  • Updated August 4, 2026
  • microsoft/aspire-skills

aspireify is an agent skill that wires an Aspire AppHost after aspire init by scanning the repo, proposing resources, editing the host, and validating with aspire start.

About

The aspireify skill is a one-time wiring workflow that turns an Aspire AppHost skeleton into a working local graph after aspire init. It scans the repository for .NET, Node, and Python services, docker-compose dependencies, connection strings, and integration candidates, then proposes a resource graph before editing. It supports C# SDK-style Program.cs, file-based apphost.cs, and TypeScript apphost.ts hosts while refusing any edits inside generated .aspire/modules files. Guidance follows Aspire 13.4 principles: adapt the AppHost to the app, surface tradeoffs instead of silent decisions, verify APIs with aspire docs search before coding, migrate .env and user secrets into parameters with approval, and optimize local development rather than production deployment. The workflow runs scan, propose, edit, validate with aspire start and aspire wait, then self-deactivates after a clean start. It wires Aspire.ServiceDefaults, OpenTelemetry, health checks, and optional docker-compose migration. Triggers include wire AppHost, scaffold resource graph, add Postgres or Redis to Aspire, or what next after aspire init.

  • Scans repos and proposes a resource graph before editing AppHost code.
  • Supports C#, file-based C#, and TypeScript AppHosts with API lookup.
  • Refuses edits inside generated .aspire/modules TypeScript files.
  • Migrates .env and user secrets into Aspire parameters with user approval.
  • Validates end to end with aspire start, aspire wait, then hands off to orchestration.

Aspireify by the numbers

  • 127 all-time installs (skills.sh)
  • +15 installs in the week ending Aug 4, 2026 (Skillselion tracking)
  • Ranked #502 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

aspireify capabilities & compatibility

Capabilities
repository scan for services and dependencies · resource graph proposal before apphost edits · c# and typescript apphost wiring patterns · servicedefaults and opentelemetry integration · end to end validation with aspire start and wait
Works with
docker · kubernetes
Use cases
devops · orchestration
npx skills add https://github.com/microsoft/aspire-skills --skill aspireify

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs127
repo stars76
Last updatedAugust 4, 2026
Repositorymicrosoft/aspire-skills

How do I turn an Aspire AppHost skeleton into a working local resource graph after aspire init?

Wire an Aspire AppHost after aspire init by scanning the repo, proposing a resource graph, editing C# or TypeScript AppHost code, and validating with aspire start.

Who is it for?

Teams with an Aspire skeleton who need Postgres, Redis, APIs, and frontends connected in the AppHost.

Skip if: Skip for start/stop orchestration, production deployment, or repos that already have a fully wired AppHost.

When should I use this skill?

User asks to wire AppHost, scaffold a resource graph, or continue after aspire init.

What you get

A wired AppHost with ServiceDefaults, validated resources, and a clean aspire start ready for orchestration.

Files

SKILL.mdMarkdownGitHub ↗

Aspireify

One-time wiring skill. aspire init drops a skeleton; aspireify turns
that skeleton into a working AppHost by scanning the repo, proposing a resource
graph, editing the AppHost, wiring Aspire.ServiceDefaults, and validating end
to end. Self-deactivates after a clean aspire start. Aligned with Aspire 13.4
guidance from the current Aspire development branch.

🚫 Hard Refusal: Never Edit .aspire/modules/

REFUSE any request to edit, modify, change, open-for-edit, or "tweak" files
inside .aspire/modules/ of a TypeScript AppHost. This directory is generated by Aspire
from apphost.ts and the integration packages — every file in it gets **clobbered
on the next build, aspire add, or aspire start**.

>

If a user asks to edit something in .aspire/modules/ (e.g., .aspire/modules/postgres.module.ts),
the correct response is:

>

1. Refuse the edit with a clear "I won't edit .aspire/modules/" statement.
2. Explain that .aspire/modules/ is generated and any changes are clobbered.
3. Redirect the requested change to apphost.ts — the only file the user
should hand-edit in a TS AppHost.
4. If the user wants a new integration, suggest aspire add <package>; if they want
to change configuration, show the equivalent edit in apphost.ts.
❌ Wrong✅ Right
Open .aspire/modules/postgres.module.ts and tweak the connection optionsEdit apphost.ts and change addPostgres('pg', { ... }) options there
Modify a generated .aspire/modules/*.ts file directlyRe-run aspire add <package> after updating apphost.ts
Comment out a line in .aspire/modules/ to disable a resourceRemove or guard the resource declaration in apphost.ts

This rule applies even if the user insists, even for "one-line" changes, even for "just to test something." The TS AppHost regenerates .aspire/modules/ deterministically; edits are unrecoverable noise.

Guiding Principles From Aspire 13.4

Minimize changes to the user's code

Adapt the AppHost to fit the app, not the other way around. Prefer WithEnvironment() to match existing environment variable names, Aspire-managed ports over fixed ports, and 1:1 Docker Compose mapping before optimizing. Do not restructure directories, rename files, or change build scripts unless the user explicitly chooses that tradeoff.

Surface tradeoffs; do not decide silently

When a small code change unlocks better Aspire integration, present both options: the zero-code-change mapping and the small-change version that enables WithReference, health checks, service discovery, dynamic ports, or dashboard telemetry. Ask which approach the user wants, then implement that choice without complaint.

Verify APIs before writing AppHost code

Use aspire docs search <topic> and aspire docs get <slug> for workflow guidance. Use aspire docs api search <query> --language csharp|typescript and aspire docs api get <id> for API shape. Use aspire integration list/search to find integrations before aspire add. Do not invent packages, methods, overloads, or command shapes; C# and TypeScript AppHost APIs differ.

Keep configuration visible in the AppHost

Scan .env, .env.local, .env.development, secrets.json.example, <UserSecretsId>, and setup scripts. Propose migrating values into AppHost parameters: connection strings become Aspire resources, API keys/tokens become secret parameters, and non-secret config becomes plain parameters or WithEnvironment() values. Never delete .env files or remove existing UserSecretsId entries without explicit user approval because non-Aspire workflows may still depend on them.

Local development first

This skill optimizes local development, not production deployment. Prefer persistent container lifetimes and data volumes for databases/caches, use HTTPS endpoints by default, pass endpoint references instead of hardcoded URLs, and model external SaaS URLs/API keys as parameters so they are visible in the dashboard.

Redis TLS edge case

Aspire can automatically provision TLS certificates for container resources. If Redis health checks fail with SSL/TLS handshake errors, do not fall back to AddContainer(). Use WithoutHttpsCertificate() on the Redis resource when the consuming app expects plain Redis.

Project-Local Override

If .agents/skills/aspireify/SKILL.md exists (installed by aspire init or aspire agent init --skills aspireify), warn the user that a project-local copy is present and defer to it. The plugin version is the fallback.

⚠️ Project-local .agents/skills/aspireify/SKILL.md detected — deferring to it.

Prerequisites

RequirementInstall
.NET 10.0 SDK (C# AppHost)https://dotnet.microsoft.com/download
Node.js 20+ (TS AppHost)https://nodejs.org
Aspire CLI`curl -sSL https://aspire.dev/install.sh \
Skeleton already droppedaspire init produced aspire.config.json + AppHost stub

Detection — When to Activate

Activate when ANY signal is present AND the AppHost is unwired (no resources declared beyond the stub):

SignalHow to DetectConfidence
Skeleton just droppedaspire init just ran in this session✅ Definitive
Empty AppHost stubapphost.cs / Program.cs / apphost.ts only contains Build().Run()✅ Definitive
aspire.config.json without resourcesConfig present, AppHost has no AddProject/addProjectHigh
User asks to "wire" / "scaffold resource graph"Verb match: wire, scaffold, integrate, hook up, add Postgres/Redis/etc.High
User asks "what next after aspire init"Direct handoff request✅ Definitive
Existing repo with services + new AppHostRepo has .csproj/package.json projects but AppHost references noneHigh

If the AppHost already has wired resources and the user wants to start/stop the app → aspire-orchestration. If the user wants to deployaspire-deployment.

Language Support

AppHost StyleDetectionEdit Target
C# SDK-style.csproj containing <Sdk Name="Aspire.AppHost.Sdk" />Program.cs (top-level statements)
File-based C#apphost.cs with #:sdk Aspire.AppHost.Sdk and #:package directivesapphost.cs itself
TypeScriptapphost.ts with generated .aspire/modules/apphost.ts only — never edit `.aspire/modules/`

See references/csharp-authoring.md and references/typescript-authoring.md.

Workflow Phases

1. SCAN     → discover projects, services, dependencies, integration candidates
2. PROPOSE  → resource graph + integration list, confirm with user
3. EDIT     → wire AppHost, add ServiceDefaults + OTel + health checks
4. VALIDATE → aspire start --non-interactive → aspire wait <each resource>
5. DEACTIVATE → confirm clean start, hand off to aspire-orchestration

For the detailed, upstream-parity workflow, load these references before editing:

  • apphost-wiring.md — full AppHost wiring workflow, API lookup, endpoint/parameter patterns, validation, solution updates, and cleanup.
  • docker-compose.md — docker-compose migration, profiles, image mapping, ports, volumes, and depends_on.
  • full-solution-apphosts.md — large solution triage, mixed SDK boundaries, solution membership, ServiceDefaults placement, and legacy host migration.
  • javascript-apps.md — JavaScript resource selection, workspace/monorepo package-manager handling, ports, scripts, and TS AppHost package config.
  • opentelemetry.md — optional Node.js, Python, and Go OpenTelemetry wiring for non-.NET services.

1. Scan

Walk the repo and inventory:

WhatHow
.NET projectsfind . -name '*.csproj' -not -path '*/bin/*' -not -path '*/obj/*'
Node servicesfind . -name 'package.json' -not -path '*/node_modules/*'
Python servicesfind . -name 'pyproject.toml' -o -name 'requirements.txt'
Container deps in composedocker-compose.yml, compose.yaml (Postgres? Redis? Rabbit?)
Connection stringsgrep appsettings*.json, .env*, config/* for Postgres, Redis, Mongo, RabbitMQ, Cosmos, ServiceBus
Integration packagesdotnet list package per project; package.json dependencies
Existing endpointshardcoded ports in launchSettings.json, next.config.js, vite.config.ts

Full heuristics in references/scan-and-propose.md.

2. Propose

Present a resource graph before editing. Ask clarifying questions:

  • "I see Postgres in docker-compose.yml — should I model it as AddPostgres('db') or use Azure Database for PostgreSQL?"
  • "Your React app hardcodes http://localhost:5000 — replace with Aspire service discovery (endpoint.url)?"
  • "Your API has an /admin endpoint — exclude it from WithReference() so consumers don't see it?"

3. Edit

Apply the proposed graph. Use the right authoring style for the AppHost language.

4. Validate

aspire start --non-interactive --format Json
aspire wait <resource>          # repeat for each declared resource
aspire describe --format Json   # sanity check graph

Full validation flow + recovery in references/validation.md.

5. Self-Deactivate

After a clean aspire start, announce:

✅ AppHost wired and validated. Handing off to aspire-orchestration for
   day-to-day start/stop/wait. Aspireify is done.

Integration Discovery Catalog

Map detected services → Aspire integrations. See references/scan-and-propose.md for the full catalog.

DetectedC#TS
Postgres in compose / Npgsql packageAddPostgres("pg").AddDatabase("db")addPostgres('pg').addDatabase('db')
Redis in compose / StackExchange.RedisAddRedis("cache")addRedis('cache')
RabbitMQAddRabbitMQ("mq") (v7 client w/ pub-sub tracing)addRabbitMQ('mq')
MongoDBAddMongoDB("mongo")addMongoDB('mongo')
Cosmos DBAddAzureCosmosDB("cosmos")addAzureCosmosDB('cosmos')
Azure Service BusAddAzureServiceBus("sb")addAzureServiceBus('sb')
Azure Cache for Redis (Entra)AddAzureRedis("cache") (now GA)addAzureRedis('cache')
Next.js frontendAddNextJsApp("web", "./web")addNextJsApp('web', '../web')
Vite SPAAddViteApp("web", "./web")addViteApp('web', '../web')
Plain Node appAddNodeApp("api", "server.js")addNodeApp('api', 'server.js')

Current Authoring Rules

RuleWhy
Use unified `withEnvironment(name, value)` in TS — never the deprecated per-kind helpers (withEnvironmentEndpoint, withEnvironmentParameter, etc.)Single API handles all value kinds; per-kind helpers are deprecated
Use AddNextJsApp / AddViteApp over hand-rolled Dockerfiles for JS frontendsFirst-class lifecycle + PublishAs* integration
Use PublishAsStaticWebsite / PublishAsNodeServer / PublishAsPackageScript for JS publishReplaces hand-rolled Dockerfiles; SPA → static, SSR Node → NodeServer, package-script SSR → PackageScript
Add WithBrowserLogs() to frontend resources for browser console + screenshots in dashboardAspire.Hosting.Browsers surfaces browser telemetry in the dashboard
Bind every resource to a compute environment with WithComputeEnvironment(env) when multiple environments existMulti-environment deploys require explicit binding
Never edit `.aspire/modules/` in TS AppHostsGenerated; edits get clobbered. Edit only apphost.ts
Use WithEndpoint("name", e => ...) to update endpointsEndpoint callbacks update existing endpoints rather than throwing on duplicates
Mark admin endpoints with ExcludeReferenceEndpoint = truePrevents consumers from receiving admin URLs via WithReference()
Look up unfamiliar API: `aspire docs api search <query> --language csharp\typescript`

C# vs TS Quick Reference

ConceptC#TypeScript
Buildervar builder = DistributedApplication.CreateBuilder(args);const builder = await createBuilder();
Add projectbuilder.AddProject<Projects.Api>("api") (SDK) or AddProject("api", "../Api/Api.csproj")await builder.addProject('api', '../Api/Api.csproj')
Wire env var (any value type).WithEnvironment("KEY", value).withEnvironment('KEY', value) ← unified API
Wait for dependency.WaitFor(db).waitFor(db)
Pass connection.WithReference(db).withReference(db)
External HTTP.WithExternalHttpEndpoints().withExternalHttpEndpoints()
Endpoint expressionapi.GetEndpoint("http")api.getEndpoint('http').url / .host / .port
Build + runbuilder.Build().Run();await builder.build().run();

ServiceDefaults Wiring

Each project should call builder.AddServiceDefaults(); to opt into OpenTelemetry, health checks, and service discovery. Add the Aspire.ServiceDefaults project reference (or NuGet for non-monorepo). See references/service-defaults.md.

Endpoint & Reference Conventions

// Public-facing API. Mark "admin" endpoint as not-for-consumers.
var api = builder.AddProject<Projects.Api>("api")
    .WithExternalHttpEndpoints()
    .WithEndpoint("admin", e => e.ExcludeReferenceEndpoint = true);

// Frontend wires the API via service discovery.
builder.AddNextJsApp("web", "./web")
    .WithReference(api)        // injects services__api__http and __https
    .WaitFor(api)
    .WithBrowserLogs();        // browser console + screenshots

Validation & Recovery

SymptomAction
aspire start fails with build errorFix code, re-run aspire start
aspire wait rejects resource nameUse displayName from aspire ps --format Json (#15842)
File-lock errors during editHand off to aspire-orchestrationaspire stop → retry
Resource missing from aspire psMay be hidden — re-run with --include-hidden
TS AppHost change ignoredConfirm you edited apphost.ts, not .aspire/modules/
Mixed JSON output from aspire startStrip non-JSON lines before parsing (#15843)

Full flow in references/validation.md.

Handoff Rules

ScenarioRoute To
AppHost skeleton not yet droppedaspire-init skill
Day-to-day start/stop/wait/restartaspire-orchestration skill
Publish, deploy, destroy, pipeline stepsaspire-deployment skill
Logs, traces, metrics, dashboard, browser log inspectionaspire-monitoring skill
Deployed (Azure/AKS) app diagnosticsazure-diagnostics skill (azure-skills)

Key Rules

  • Never overwrite existing files — always augment or merge.
  • Ask before modifying service code, especially OpenTelemetry and ServiceDefaults injection.
  • Respect existing project structure — do not reorganize the repo.
  • If stuck, use `aspire doctor` to diagnose environment issues.
  • Never hardcode URLs in `WithEnvironment` / `withEnvironment` — pass endpoint references such as api.GetEndpoint("http") or api.getEndpoint('http') instead of string literals.
  • Never use `WithUrlForEndpoint` / `withUrlForEndpoint` to set `dev.localhost` URLs — that API is only for dashboard display labels; dev.localhost belongs in AppHost launch/profile configuration.

References

  • apphost-wiring.md — Detailed AppHost wiring workflow and API lookup patterns
  • docker-compose.md — Docker Compose migration patterns
  • full-solution-apphosts.md — Large/full-solution AppHost guidance
  • javascript-apps.md — JavaScript/TypeScript app and workspace handling
  • opentelemetry.md — Non-.NET OpenTelemetry setup
  • scan-and-propose.md — Repo scan heuristics + integration catalog
  • csharp-authoring.md — C# AppHost patterns
  • typescript-authoring.md — TS AppHost patterns + parity APIs
  • service-defaults.md — Wire OTel, health checks, service discovery
  • validation.md — End-to-end validation + recovery

Related skills

FAQ

Can aspireify edit files in .aspire/modules?

No. That directory is generated and changes are clobbered on the next build or aspire start.

When should I use aspireify?

After aspire init when the AppHost stub has no wired resources and you need a working local graph.

Is aspireify safe to install?

Review the Security Audits panel on this page before installing in production.

DevOps & CI/CDdevopsintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.