We've all been there. The README says "just run docker-compose up" but it never works the first time. Five languages, one app, no map.
Each language has its own logging, its own config format, its own service discovery pattern. You end up with hardcoded URLs everywhere.
Use the official positioning sentence verbatim. It sets up everything that follows. Then transition to the four pillars.
The language toolchains stay in place: you still have Python, Node, and .NET. Aspire orchestrates them behind one command. Config formats: .env, YAML, application.properties, appsettings.json. Observability panes: logs, traces, metrics, normally three separate tools. Aspire folds all of it into one model and one dashboard.
Four pillars hold up the whole model: the CLI drives it, the AppHost declares it, the Dashboard shows it, and Integrations plug into it. Same four regardless of language.
Five languages funnel into one orchestrator, and out come the same three capabilities: orchestration, service discovery, and observability. Each one maps onto the rest of the talk.
This is the Aspire AppHost, the central brain that starts everything and wires it together. Python, React, .NET, all visible in one dashboard.
This is the payoff. Show it early. One dashboard for everything, regardless of language. Click a trace to see the full waterfall across Python, .NET, and Node.js. Export as .env for local debugging.
This closes a real adoption gap for polyglot teams: "I'm not on .NET, can I still use any of this?" Yes, start here.
Once they like the UI, the AppHost story becomes a much easier sell.
Add the OTel SDK, point at the env var Aspire injects, and you're done.
Node gets even better: auto-instrumentations grab HTTP, DB, redis, etc. for free.
The AppHost is the central orchestrator. All services report their telemetry to the unified dashboard.
Now let's look at the mechanisms under the hood.
This is the magic. The double underscore __ is used because environment variables can't have colons.
Each runtime has its own env-var idiom, but the pattern is identical.
Aspire handles connection-string complexity so you don't manage .env files.
For C# AppHosts using AddPostgres, connection strings are auto-generated. For polyglot AppHosts, you wire env vars explicitly, for the same result with more control.
Aspire manages startup ordering automatically based on WithReference and WaitFor dependencies. Infrastructure comes up first, then backends, then frontends. Over 100 integrations are wired to the same lifecycle so health/dependency rules apply to everything in the AppHost.
C# is the original AppHost language. Most existing samples use this.
The TypeScript AppHost uses the same integration packages as C#.
Per aspire.dev/languages-and-runtimes: only C# and TypeScript are documented AppHost authoring languages today.
AppHost authoring is C#/TS today; workload language support is separate and much broader.
Integration authors don't write a TS binding by hand. The analyzer + ATS scanner generates it.
That's how 100+ .NET integrations show up automatically in TypeScript AppHosts.
Quick reference for the runtime side.
Keep this slide handy. These are the building blocks for everything we covered.
Drop aspire.config.json at the project root. The CLI reads it on every command.
Common gotcha: feature flags are JSON booleans, not strings.
The CLI is the friendlier surface. Most teams never edit aspire.config.json directly.
aspire doctor is great before a talk. aspire start runs in detached mode. aspire new is language-aware. It scaffolds the right AppHost structure for your chosen language.
Per aspire.dev/get-started/aspire-mcp-server/. CLI MCP = stdio + `aspire agent init`. Dashboard MCP = streamable HTTP + API key from the dashboard UI.
Earlier drafts invented an `http://localhost:15889/mcp` URL that doesn't exist for the CLI server.
Time to see Aspire in action!
Ordered by escalating complexity: same orchestration model, increasing sophistication.
The bars count how many of the eight samples use each language; polyglot samples span several. No matter the mix, it's one dashboard and one orchestration model.
The simplest polyglot demo. TypeScript AppHost with auto-wired API and frontend.
Python orchestrating Python: the AppHost and the service are both Python.
Full-stack TypeScript-orchestrated app with Python backend and Redis caching.
Real-time voting with HTMX partial updates, Django backend, PostgreSQL persistence.
Java orchestrating Java: experimental Java AppHost with Spring Boot and PostgreSQL.
Go orchestrating a full-stack app: Go API backend with Svelte frontend.
Classic .NET AppHost orchestrating Angular frontend with CosmosDB emulator.
The ultimate polyglot demo: three languages, one event pipeline, full distributed tracing.
This works whether your services are Python, Go, Java, TypeScript, or .NET. You don't need per-language deploy plumbing.
The pivot: aspire run β aspire deploy. Same model, no extra plumbing.
If your team uses multiple languages, Aspire gives you a single place to define, run, observe, and deploy your entire stack.