We've all been there: README says "just run docker-compose up" but it never works the first time. Each language has its own logging, its own config format, its own service discovery pattern. You end up with hardcoded URLs everywhere.
Transition from problem to solution
This is the Aspire AppHost. It's the central brain that starts everything and wires it together. Python, React, .NET โ all visible in one dashboard, auto-wired, observable. No .NET SDK required for non-.NET devs if you use a polyglot AppHost.
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 is how you get your service into that dashboard we just saw. Add the OTel SDK, point at the env var Aspire injects, and you're done.
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. Every language can read env vars โ that's the universal interface.
Aspire handles the complexity of connection strings so you don't have to manage .env files. For C# AppHosts using AddPostgres, connection strings are auto-generated. For polyglot AppHosts, you wire env vars explicitly โ same result, more control.
Aspire manages startup ordering automatically based on WithReference and WaitFor dependencies. Infrastructure comes up first, then backends, then frontends.
The TypeScript AppHost uses the same integration packages as C#, auto-generated via [AspireExport] attributes. A JS/TS team never needs to touch .NET.
Each language has its own idioms โ Python uses snake_case, TypeScript uses camelCase, Go returns errors โ but the Aspire model is the same everywhere. The C# SDK has the most typed integrations, but all five languages can orchestrate any service via Dockerfile or container.
Keep this slide handy as a quick reference for everything we just covered!
This is the key file. Drop aspire.config.json in your project root, point it at your AppHost file, set the language, and aspire run just works. The CLI reads this to know how to build and launch your app.
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.
Time to see Aspire in action!
Ordered by escalating complexity โ same orchestration model, increasing sophistication.
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.
The same AppHost that runs locally can drive your deployment pipeline. No separate config needed.
If your team uses multiple languages, Aspire gives you a single place to define, run, observe, and deploy your entire stack.